2
0
mirror of https://github.com/fhem/fhem-mirror.git synced 2025-04-20 19:36:02 +00:00

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
This commit is contained in:
phenning 2017-10-08 17:25:19 +00:00
parent f7b4a33f5e
commit f9af07816b
4 changed files with 394 additions and 136 deletions

View File

@ -37,11 +37,115 @@ use vars qw($FW_ME);
######################### #########################
# Global variables # Global variables
my $alarmname = "Alarms"; # link text my $alarmlinkname = "Alarms"; # link text
my $alarmhiddenroom = "AlarmRoom"; # hidden room my $alarmhiddenroom = "AlarmRoom"; # hidden room
my $alarmpublicroom = "Alarm"; # public room my $alarmpublicroom = "Alarm"; # public room
my $alarmno = 8; 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->{GetFn} = "Alarm_Get";
$hash->{UndefFn} = "Alarm_Undef"; $hash->{UndefFn} = "Alarm_Undef";
#$hash->{AttrFn} = "Alarm_Attr"; #$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++ ){ 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 "; $attst .=" level".$level."start level".$level."end level".$level."msg level".$level."xec:0,1 level".$level."onact level".$level."offact ";
} }
$hash->{AttrList} = $attst; $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}{LINK} = "?room=".$alarmhiddenroom;
$data{FWEXT}{Alarmx}{NAME} = $alarmname; $data{FWEXT}{Alarmx}{NAME} = $alarmlinkname;
return undef; return undef;
} }
@ -84,10 +199,24 @@ sub Alarm_Define ($$) {
my $now = time(); my $now = time();
my $name = $hash->{NAME}; my $name = $hash->{NAME};
$hash->{VERSION} = $alarmversion; $hash->{VERSION} = $alarmversion;
#-- 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 ); readingsSingleUpdate( $hash, "state", "Initialized", 1 );
$alarmhiddenroom = defined($attr{$name}{"hiddenroom"}) ? $attr{$name}{"hiddenroom"} : $alarmhiddenroom; $alarmhiddenroom = defined($attr{$name}{"hiddenroom"}) ? $attr{$name}{"hiddenroom"} : $alarmhiddenroom;
$alarmpublicroom = defined($attr{$name}{"publicroom"}) ? $attr{$name}{"publicroom"} : $alarmpublicroom; $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); RemoveInternalTimer($hash);
InternalTimer ($now + 5, 'Alarm_CreateEntry', $hash, 0); InternalTimer ($now + 5, 'Alarm_CreateEntry', $hash, 0);
@ -105,8 +234,14 @@ sub Alarm_Define ($$) {
sub Alarm_Undef ($$) { sub Alarm_Undef ($$) {
my ($hash,$arg) = @_; my ($hash,$arg) = @_;
my $name = $hash->{NAME};
RemoveInternalTimer($hash); 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; return undef;
} }
@ -121,6 +256,16 @@ sub Alarm_Undef ($$) {
sub Alarm_Attr($$$) { sub Alarm_Attr($$$) {
my ($cmd, $name, $attrName, $attrVal) = @_; 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; return;
} }
@ -155,6 +300,7 @@ sub Alarm_CreateEntry($) {
} }
} }
} }
#-- recover state from stored readings #-- recover state from stored readings
for( my $level=0;$level<$alarmno;$level++ ){ for( my $level=0;$level<$alarmno;$level++ ){
my $val = ReadingsVal($name,"level".$level,""); my $val = ReadingsVal($name,"level".$level,"");
@ -247,7 +393,9 @@ sub Alarm_getstate($) {
if( $type eq "simple" ){ if( $type eq "simple" ){
for( my $level=0;$level<$alarmno;$level++ ){ for( my $level=0;$level<$alarmno;$level++ ){
$val = $hash->{READINGS}{"level".$level}{VAL}; $val = $hash->{READINGS}{"level".$level}{VAL};
if( ($val eq "disarmed")||($val eq "armed") ){ if( $val eq "disarmed" ){
$res .= '-';
}elsif( $val eq "armed" ){
$res .= 'O'; $res .= 'O';
}else{ }else{
$res .= 'X'; $res .= 'X';
@ -255,13 +403,15 @@ sub Alarm_getstate($) {
} }
#-------------------------- #--------------------------
}elsif( $type eq "color" ){ }elsif( $type eq "color" ){
$res = '<span style="color:green">'; $res = '<span style="color:lightgray">';
for( my $level=0;$level<$alarmno;$level++ ){ for( my $level=0;$level<$alarmno;$level++ ){
$val = $hash->{READINGS}{"level".$level}{VAL}; $val = $hash->{READINGS}{"level".$level}{VAL};
if( ($val eq "disarmed")||($val eq "armed") ){ if( $val eq "disarmed" ){
$res .= ' '.$level; $res .= ' '.$level;
}elsif( $val eq "armed" ){
$res .= ' <span style="width:1ex;font-weight:bold;color:green">'.$level.'</span>';
}else{ }else{
$res.=' <span style="width:1ex;color:red">'.$level.'</span>'; $res .= ' <span style="width:1ex;font-weight:bold;color:red">'.$level.'</span>';
} }
} }
$res.='</span>'; $res.='</span>';
@ -270,7 +420,9 @@ sub Alarm_getstate($) {
$res = '<table><tr style="height:1ex">'; $res = '<table><tr style="height:1ex">';
for( my $level=0;$level<$alarmno;$level++ ){ for( my $level=0;$level<$alarmno;$level++ ){
$val = $hash->{READINGS}{"level".$level}{VAL}; $val = $hash->{READINGS}{"level".$level}{VAL};
if( ($val eq "disarmed")||($val eq "armed") ){ if( $val eq "disarmed" ){
$res .= '<td style="width:1ex;background-color:lightgray"/>';
}elsif( $val eq "armed" ){
$res .= '<td style="width:1ex;background-color:green"/>'; $res .= '<td style="width:1ex;background-color:green"/>';
}else{ }else{
$res .= '<td style="width:1ex;background-color:red"/>'; $res .= '<td style="width:1ex;background-color:red"/>';
@ -282,6 +434,70 @@ sub Alarm_getstate($) {
return $res; 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 # Alarm_Exec - Execute the Alarm
@ -395,8 +611,16 @@ sub Alarm_Exec($$$$$){
#Log3 $hash,1,"[Alarm] Killing delayed action $name"; #Log3 $hash,1,"[Alarm] Killing delayed action $name";
CommandDelete(undef,"$mga"); CommandDelete(undef,"$mga");
} }
#-- replace some parts
my @evtpart = split(" ",$evt);
#-- calling actors BEFORE state update #-- calling actors BEFORE state update
$cmd = AttrVal($name, "level".$level."offact", 0); $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); fhem($cmd);
$cmd = AttrVal($name, "cancelact", 0); $cmd = AttrVal($name, "cancelact", 0);
fhem($cmd) fhem($cmd)
@ -632,28 +856,26 @@ sub Alarm_CreateNotifiers($){
foreach my $d (sort keys %defs ) { foreach my $d (sort keys %defs ) {
next if(IsIgnored($d)); next if(IsIgnored($d));
if( AttrVal($d, "alarmDevice","") eq "Actor" ) { if( AttrVal($d, "alarmDevice","") eq "Actor" ) {
my @aval = split('\|',AttrVal($d, "alarmSettings","")); my @aval = Alarm_getsettings($hash,$d,"Actor");
if( int(@aval) != 4){ if( int(@aval) != 4){
Log3 $hash, 5, "[Alarm $level] Settings incomplete for alarmActor $d"; Log3 $hash, 5, "[Alarm $level] Settings incomplete for alarmActor $d";
next; next;
} }
if( index($aval[0],"alarm".$level) != -1 ){ if( index($aval[0],"alarm".$level) != -1 ){
#-- activate without delay #-- 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].';'; $cmd .= $aval[1].';';
#-- activate with delay #-- activate with delay
} else { } else {
$nonum++; $nonum++;
my @tarr = split(':',$aval[3]); my @tarr = split(':',$aval[3]);
if( int(@tarr) == 1){ if( int(@tarr) == 2){
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]); $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].';' $cmd2 .= $aval[2].';'
@ -712,6 +934,16 @@ sub Alarm_Html($)
my $hash = $defs{$name}; my $hash = $defs{$name};
my $id = $defs{$name}{NR}; 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 ); readingsSingleUpdate( $hash, "state", Alarm_getstate($hash)." ".$hash->{READINGS}{"short"}{VAL}, 1 );
@ -722,16 +954,16 @@ sub Alarm_Html($)
#-- #--
$ret .= "<script type=\"text/javascript\" src=\"$FW_ME/pgm2/alarm.js\"></script><script type=\"text/javascript\">\n"; $ret .= "<script type=\"text/javascript\" src=\"$FW_ME/pgm2/alarm.js\"></script><script type=\"text/javascript\">\n";
$ret .= "var alarmno = ".$alarmno.";\n"; $ret .= "var alarmno = ".$alarmno.";\n";
for( my $k=0;$k<$alarmno;$k++ ){ #for( my $k=0;$k<$alarmno;$k++ ){
$ret .= "ah.setItem('l".$k."s','".AttrVal($name, "level".$k."start", 0)."');\n" # $ret .= "ah.setItem('l".$k."s','".AttrVal($name, "level".$k."start", 0)."');\n"
if( defined AttrVal($name, "level".$k."start", 0)); # if( defined AttrVal($name, "level".$k."start", 0));
$ret .= "ah.setItem('l".$k."e','".AttrVal($name, "level".$k."end", 0)."');\n" # $ret .= "ah.setItem('l".$k."e','".AttrVal($name, "level".$k."end", 0)."');\n"
if( defined AttrVal($name, "level".$k."end", 0)); # if( defined AttrVal($name, "level".$k."end", 0));
$ret .= "ah.setItem('l".$k."m','".AttrVal($name, "level".$k."msg", 0)."');\n" # $ret .= "ah.setItem('l".$k."m','".AttrVal($name, "level".$k."msg", 0)."');\n"
if( defined AttrVal($name, "level".$k."msg", 0)); # if( defined AttrVal($name, "level".$k."msg", 0));
$ret .= "ah.setItem('l".$k."x','".AttrVal($name, "level".$k."xec", 0)."');\n" # $ret .= "ah.setItem('l".$k."x','".AttrVal($name, "level".$k."xec", 0)."');\n"
if( defined AttrVal($name, "level".$k."xec", 0)); # if( defined AttrVal($name, "level".$k."xec", 0));
} #}
$ret .= "</script>\n"; $ret .= "</script>\n";
$ret .= "<table class=\"roomoverview\">\n"; $ret .= "<table class=\"roomoverview\">\n";
@ -739,25 +971,26 @@ sub Alarm_Html($)
#-- settings table #-- settings table
my $row=1; my $row=1;
$ret .= "<tr><td><div class=\"devType\">Settings</div></td></tr>"; $ret .= "<tr><td><div class=\"devType\">".$alarm_tt->{"settings"}."</div></td></tr>";
$ret .= "<tr><td><table class=\"block wide\" id=\"settingstable\">\n"; $ret .= "<tr><td><table class=\"block wide\" id=\"settingstable\">\n";
$ret .= "<tr class=\"odd\"><td class=\"col1\" colspan=\"4\"><table id=\"armtable\" border=\"0\">\n"; $ret .= "<tr class=\"odd\"><td class=\"col1\" colspan=\"4\"><table id=\"armtable\" border=\"0\">\n";
$ret .= "<tr class==\"odd\"><td class=\"col1\" align=\"right\">Arm Button &#8608</td>"; $ret .= "<tr class=\"odd\"><td class=\"col1\" style=\"text-align:right\">".$alarm_tt->{"armbutton"}."&nbsp;&#8608</td>";
$ret .= "<td class=\"col2\" align=\"right\"> Wait Action "; $ret .= "<td class=\"col2\" style=\"text-align:right\"> ".$alarm_tt->{"waitaction"}." ";
$ret .= sprintf("<input type=\"text\" id=\"armwait\" size=\"50\" maxlength=\"512\" value=\"%s\"/>",(AttrVal($name, "armwait","") eq "1")?"":AttrVal($name, "armwait","")); $ret .= sprintf("<input type=\"text\" id=\"armwait\" size=\"50\" maxlength=\"512\" value=\"%s\"/>",(AttrVal($name, "armwait","") eq "1")?"":AttrVal($name, "armwait",""));
$ret .= "</td><td class=\"col3\" rowspan=\"2\"> &#8628 Delay <br> &#8626"; $ret .= "</td><td class=\"col3\" rowspan=\"2\"> &#8628 ".$alarm_tt->{"delay"}."<br> &#8626";
$ret .= sprintf("<input type=\"text\" id=\"armdelay\" size=\"4\" maxlength=\"5\" value=\"%s\"/>",(AttrVal($name, "armdelay","0:00") eq "1")?"":AttrVal($name, "armdelay","0:00")); $ret .= sprintf("<input type=\"text\" id=\"armdelay\" size=\"4\" maxlength=\"5\" value=\"%s\"/>",(AttrVal($name, "armdelay","0:00") eq "1")?"":AttrVal($name, "armdelay","0:00"));
$ret .= "</td></tr>\n"; $ret .= "</td></tr>\n";
$ret .= "<tr class==\"even\"><td class=\"col1\"></td><td class=\"col2\" align=\"right\">Arm Action "; $ret .= "<tr class=\"even\"><td class=\"col1\"></td><td class=\"col2\" style=\"text-align:right\">".$alarm_tt->{"armaction"}." ";
$ret .= sprintf("<input type=\"text\" id=\"armaction\" size=\"50\" maxlength=\"512\" value=\"%s\"/>",(AttrVal($name, "armact","") eq "1")?"":AttrVal($name, "armact","")); $ret .= sprintf("<input type=\"text\" id=\"armaction\" size=\"50\" maxlength=\"512\" value=\"%s\"/>",(AttrVal($name, "armact","") eq "1")?"":AttrVal($name, "armact",""));
$ret .= "</td></tr>\n"; $ret .= "</td></tr>\n";
$ret .="<tr class==\"odd\"><td class=\"col1\">Disarm Button &#8608</td><td class=\"col2\" align=\"right\">Disarm Action "; $ret .="<tr class=\"odd\"><td class=\"col1\" style=\"text-align:right\">".$alarm_tt->{"disarmbutton"}."&#8608</td><td class=\"col2\" style=\"text-align:right\">".$alarm_tt->{"disarmaction"}." ";
$ret .= sprintf("<input type=\"text\" id=\"disarmaction\" size=\"50\" maxlength=\"512\" value=\"%s\"/>",(AttrVal($name, "disarmact","") eq "1")?"":AttrVal($name, "disarmact","")); $ret .= sprintf("<input type=\"text\" id=\"disarmaction\" size=\"50\" maxlength=\"512\" value=\"%s\"/>",(AttrVal($name, "disarmact","") eq "1")?"":AttrVal($name, "disarmact",""));
$ret .= "</td><td></td></tr><tr class==\"odd\"><td class=\"col1\">Cancel Button &#8608</td><td class=\"col2\" align=\"right\"> Cancel Action "; $ret .= "</td><td></td></tr><tr class=\"odd\"><td class=\"col1\" style=\"text-align:right\">".$alarm_tt->{"cancelbutton"}."&nbsp;&#8608</td><td class=\"col2\" style=\"text-align:right\"> ".$alarm_tt->{"cancelaction"}." ";
$ret .= sprintf("<input type=\"text\" id=\"cancelaction\" size=\"50\" maxlength=\"512\" value=\"%s\"/>",(AttrVal($name, "cancelact","") eq "1")?"":AttrVal($name, "cancelact","")); $ret .= sprintf("<input type=\"text\" id=\"cancelaction\" size=\"50\" maxlength=\"512\" value=\"%s\"/>",(AttrVal($name, "cancelact","") eq "1")?"":AttrVal($name, "cancelact",""));
$ret .= "</td><td></td></tr></table></td></tr>"; $ret .= "</td><td></td></tr></table></td></tr>";
$ret .= "<tr class=\"odd\"><td class=\"col1\">Level</td><td class=\"col2\">Time [hh:mm]</td><td class=\"col3\">Message Part II</td>". $ret .= "<tr class=\"odd\"><td class=\"col1\">".$alarm_tt->{"level"}."</td><td class=\"col2\">".$alarm_tt->{"time"}." [hh:mm]<br/>".
"<td class=\"col4\">Armed/Cancel</td></tr>\n"; $alarm_tt->{"start"}."&nbsp;&nbsp;&nbsp;&nbsp;".$alarm_tt->{"end"}."&nbsp;</td><td class=\"col3\">".$alarm_tt->{"messagepart"}." II</td>".
"<td class=\"col4\">".$alarm_tt->{"arm"}."/".$alarm_tt->{"cancel"}."</td></tr>\n";
for( my $k=0;$k<$alarmno;$k++ ){ for( my $k=0;$k<$alarmno;$k++ ){
$row++; $row++;
my $sval = AttrVal($name, "level".$k."start", 0); my $sval = AttrVal($name, "level".$k."start", 0);
@ -771,21 +1004,22 @@ sub Alarm_Html($)
if( $mval eq "1"); if( $mval eq "1");
my $xval = AttrVal($name, "level".$k."xec", 0); my $xval = AttrVal($name, "level".$k."xec", 0);
$ret .= sprintf("<tr class=\"%s\"><td class=\"col1\">Alarm $k</td>\n", ($row&1)?"odd":"even"); $ret .= sprintf("<tr class=\"%s\"><td class=\"col1\">".$alarm_tt->{"alarm"}." $k</td>\n", ($row&1)?"odd":"even");
$ret .= "<td class=\"col2\">Start&nbsp;<input type=\"text\" id=\"l".$k."s\" size=\"4\" maxlength=\"120\" value=\"$sval\"/>&nbsp;". $ret .= "<td class=\"col2\"><input type=\"text\" id=\"l".$k."s\" size=\"4\" maxlength=\"120\" value=\"$sval\"/>&nbsp;&nbsp;&nbsp;".
"End&nbsp;<input type=\"text\" id=\"l".$k."e\" size=\"4\" maxlength=\"120\" value=\"$eval\"/></td>". "<input type=\"text\" id=\"l".$k."e\" size=\"4\" maxlength=\"120\" value=\"$eval\"/></td>".
"<td class=\"col3\"><input type=\"text\" id=\"l".$k."m\" size=\"25\" maxlength=\"256\" value=\"$mval\"/></td>"; "<td class=\"col3\"><input type=\"text\" id=\"l".$k."m\" size=\"25\" maxlength=\"256\" value=\"$mval\"/></td>";
$ret .= sprintf("<td class=\"col4\"><input type=\"checkbox\" id=\"l".$k."x\" %s onclick=\"javascript:alarm_arm('$name','$k')\"/>",($xval eq "armed")?"checked=\"checked\"":""). $ret .= sprintf("<td class=\"col4\"><input type=\"checkbox\" id=\"l".$k."x\" %s onclick=\"javascript:alarm_arm('$name','$k')\"/>",($xval eq "armed")?"checked=\"checked\"":"").
"<input type=\"button\" value=\"Cancel\" onclick=\"javascript:alarm_cancel('$name','$k')\"/></td></tr>\n"; "<input type=\"button\" value=\"".$alarm_tt->{"cancel"}."\" onclick=\"javascript:alarm_cancel('$name','$k')\"/></td></tr>\n";
} }
$ret .= "</table></td></tr></tr>"; $ret .= "</table></td></tr></tr>";
#-- sensors table #-- sensors table
$row=1; $row=1;
$ret .= "<tr><td><div class=\"devType\">Sensors</div></td></tr>"; $ret .= "<tr><td><div class=\"devType\">".$alarm_tt->{"sensors"}."</div></td></tr>";
$ret .= "<tr><td><table class=\"block wide\" id=\"sensorstable\">\n"; $ret .= "<tr><td><table class=\"block wide\" id=\"sensorstable\">\n";
$ret .= "<tr class=\"odd\"><td/><td class=\"col2\">Notify to Alarm Level<br/>".join("&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;",(0..($alarmno-1)))."</td><td class=\"col3\">". $ret .= "<tr class=\"odd\" style=\"min-width:100px\"><td/><td class=\"col2\" style=\"min-width:200px\">".$alarm_tt->{"notifyto"}." ".$alarm_tt->{"alarm"}." ".$alarm_tt->{"level"}."<br/>".
"Notify on RegExp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Message Part I</td><td class=\"col4\">Action</td></tr>\n"; join("&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;",(0..($alarmno-1)))."</td><td class=\"col3\">".
$alarm_tt->{"notifyby"}." ".$alarm_tt->{"regexp"}."</td><td class=\"col3\">".$alarm_tt->{"messagepart"}." I</td><td class=\"col4\">".$alarm_tt->{"action"}."</td></tr>\n";
foreach my $d (sort keys %defs ) { foreach my $d (sort keys %defs ) {
next if(IsIgnored($d)); next if(IsIgnored($d));
if( AttrVal($d, "alarmDevice","") eq "Sensor" ) { if( AttrVal($d, "alarmDevice","") eq "Sensor" ) {
@ -795,16 +1029,16 @@ sub Alarm_Html($)
} }
$row++; $row++;
$ret .= sprintf("<tr class=\"%s\" informId=\"$d\" name=\"sensor\">", ($row&1)?"odd":"even"); $ret .= sprintf("<tr class=\"%s\" informId=\"$d\" name=\"sensor\">", ($row&1)?"odd":"even");
$ret .= "<td width=\"100\" class=\"col1\"><a href=\"$FW_ME?detail=$d\">$d</a></td>\n"; $ret .= "<td width=\"120\" class=\"col1\"><a href=\"$FW_ME?detail=$d\">$d</a></td>\n";
$ret .= "<td id=\"$d\" class=\"col2\">\n"; $ret .= "<td id=\"$d\" class=\"col2\">\n";
for( my $k=0;$k<$alarmno;$k++ ){ for( my $k=0;$k<$alarmno;$k++ ){
$ret .= sprintf("<input type=\"checkbox\" name=\"alarm$k\" value=\"$k\" %s/>&nbsp;",(index($aval[0],"alarm".$k) != -1)?"checked=\"checked\"":""); $ret .= sprintf("<input type=\"checkbox\" name=\"alarm$k\" value=\"$k\" %s/>&nbsp;",(index($aval[0],"alarm".$k) != -1)?"checked=\"checked\"":"");
} }
$ret .= "</td><td class=\"col3\"><input type=\"text\" name=\"alarmnotify\" size=\"13\" maxlength=\"512\" value=\"$aval[1]\"/>"; $ret .= "</td><td class=\"col3\"><input type=\"text\" name=\"alarmnotify\" size=\"30\" maxlength=\"512\" value=\"$aval[1]\"/>";
$ret .= "<input type=\"text\" name=\"alarmmsg\" size=\"13\" maxlength=\"512\" value=\"$aval[2]\"/></td>\n"; $ret .= "</td><td class=\"col3\"><input type=\"text\" name=\"alarmmsg\" size=\"30\" maxlength=\"512\" value=\"$aval[2]\"/></td>\n";
$ret .= sprintf("<td class=\"col4\"><select name=\"%sonoff\"><option value=\"on\" %s>Raise</option><option value=\"off\" %s>Cancel</option>", $ret .= sprintf("<td class=\"col4\"><select name=\"%sonoff\"><option value=\"on\" %s>".$alarm_tt->{"raise"}."</option><option value=\"off\" %s>".$alarm_tt->{"cancel"}."</option>",
$d,($aval[3] eq "on")?"selected=\"selected\"":"",($aval[3] eq "off")?"selected=\"selected\"":""); $d,($aval[3] eq "on")?"selected=\"selected\"":"",($aval[3] eq "off")?"selected=\"selected\"":"");
$ret .= sprintf("<option value=\"arm\" %s>Arm</option><option value=\"disarm\" %s>Disarm</option><select></td></tr>\n", $ret .= sprintf("<option value=\"arm\" %s>".$alarm_tt->{"arm"}."</option><option value=\"disarm\" %s>".$alarm_tt->{"disarm"}."</option><select></td></tr>\n",
($aval[3] eq "arm")?"selected=\"seleced\"":"",($aval[3] eq "disarm")?"selected=\"selected\"":""); ($aval[3] eq "arm")?"selected=\"seleced\"":"",($aval[3] eq "disarm")?"selected=\"selected\"":"");
} }
} }
@ -812,29 +1046,35 @@ sub Alarm_Html($)
#-- actors table #-- actors table
$row=1; $row=1;
$ret .= "<tr><td><div class=\"devType\">Actors</div></td></tr>"; $ret .= "<tr><td><div class=\"devType\">".$alarm_tt->{"actors"}."</div></td></tr>";
$ret .= "<tr><td><table class=\"block wide\" id=\"actorstable\">\n"; $ret .= "<tr><td><table class=\"block wide\" id=\"actorstable\">\n";
$ret .= "<tr class=\"odd\"><td/><td class=\"col2\">Set by Alarm Level<br/>".join("&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;",(0..($alarmno-1))). $ret .= "<tr class=\"odd\" style=\"min-width:100px\"><td/><td class=\"col2\" style=\"min-width:200px\">".$alarm_tt->{"setby"}." ".$alarm_tt->{"alarm"}." ".$alarm_tt->{"level"}."<br/>".join("&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;",(0..($alarmno-1))).
"</td><td class=\"col3\">Set Action". "</td><td class=\"col3\">".$alarm_tt->{"setaction"};
"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Unset Action</td><td class=\"col4\">Delay</td></tr>\n"; $ret .= "&nbsp; (".$alarm_tt->{"testaction"}.")"
if( AttrVal($name,"testbutton",0) == 1);
$ret .= "</td><td class=\"col3\">".$alarm_tt->{"unsetaction"};
$ret .= "&nbsp; (".$alarm_tt->{"testaction"}.")"
if( AttrVal($name,"testbutton",0) == 1);
$ret .= "</td><td class=\"col4\">".$alarm_tt->{"delay"}."<br/>[hh:]mm:ss</td></tr>\n";
foreach my $d (sort keys %defs ) { foreach my $d (sort keys %defs ) {
next if(IsIgnored($d)); next if(IsIgnored($d));
if( AttrVal($d, "alarmDevice","") eq "Actor" ) { if( AttrVal($d, "alarmDevice","") eq "Actor" ) {
my @aval = split('\|',AttrVal($d, "alarmSettings","|||0:00")); my @aval = Alarm_getsettings($hash,$d,"Actor");
if( int(@aval) != 4){
Log3 $hash, 1, "[Alarm] Settings incomplete for alarmActor $d";
@aval=("","","","");
}
$row++; $row++;
$ret .= sprintf("<tr class=\"%s\" informId=\"$d\" name=\"actor\">", ($row&1)?"odd":"even"); $ret .= sprintf("<tr class=\"%s\" informId=\"$d\" name=\"actor\">", ($row&1)?"odd":"even");
$ret .= "<td width=\"100\" class=\"col1\"><a href=\"$FW_ME?detail=$d\">$d</a></td>\n"; $ret .= "<td width=\"120\" class=\"col1\"><a href=\"$FW_ME?detail=$d\">$d</a></td>\n";
$ret .= "<td id=\"$d\" class=\"col2\">\n"; $ret .= "<td id=\"$d\" class=\"col2\">\n";
for( my $k=0;$k<$alarmno;$k++ ){ for( my $k=0;$k<$alarmno;$k++ ){
$ret .= sprintf("<input type=\"checkbox\" name=\"alarm$k\"%s/>&nbsp;",(index($aval[0],"alarm".$k) != -1)?"checked=\"checked\"":""); $ret .= sprintf("<input type=\"checkbox\" name=\"alarm$k\"%s/>&nbsp;",(index($aval[0],"alarm".$k) != -1)?"checked=\"checked\"":"");
} }
$ret .= "</td><td class=\"col3\"><input type=\"text\" name=\"alarmon\" size=\"13\" maxlength=\"512\" value=\"$aval[1]\"/>"; $ret .= "</td><td class=\"col3\"><input type=\"text\" name=\"alarmon\" size=\"30\" maxlength=\"512\" value=\"$aval[1]\"/>";
$ret .= "<input type=\"text\" name=\"alarmaoff\" size=\"13\" maxlength=\"512\" value=\"$aval[2]\"/></td>"; $ret .= "&nbsp;<input type=\"button\" value=\"T\" onclick=\"javascript:alarm_testaction('$name','$d','set')\"/>"
$ret .= "<td class=\"col4\"><input type=\"text\" name=\"delay\" size=\"4\" maxlength=\"5\" value=\"$aval[3]\"/></td></tr>\n"; if( AttrVal($name,"testbutton",0) == 1);
$ret .= "</td><td class=\"col3\">";
$ret .= "<input type=\"text\" name=\"alarmoff\" size=\"30\" maxlength=\"512\" value=\"$aval[2]\"/>";
$ret .= "&nbsp;<input type=\"button\" value=\"T\" onclick=\"javascript:alarm_testaction('$name','$d','unset')\"/>"
if( AttrVal($name,"testbutton",0) == 1);
$ret .= "</td><td class=\"col4\"><input type=\"text\" name=\"delay\" size=\"5\" maxlength=\"8\" value=\"$aval[3]\"/></td></tr>\n";
} }
} }
$ret .= "</table></td></tr></tr>\n"; $ret .= "</table></td></tr></tr>\n";
@ -854,7 +1094,11 @@ sub Alarm_Html($)
<a name="Alarm"></a> <a name="Alarm"></a>
<h3>Alarm</h3> <h3>Alarm</h3>
<p> FHEM module to set up a house alarm system with 8 different alarm levels</p> <p> FHEM module to set up a house alarm system with 8 different alarm levels</p>
<a name="Alarmusage"></a>
<h4>Usage</h4>
See <a href="http://www.fhemwiki.de/wiki/Modul_Alarm">German Wiki page</a>
<a name="Alarmdefine"></a> <a name="Alarmdefine"></a>
<br/>
<h4>Define</h4> <h4>Define</h4>
<p> <p>
<code>define &lt;name&gt; Alarm</code> <code>define &lt;name&gt; Alarm</code>
@ -893,7 +1137,7 @@ sub Alarm_Html($)
&lt;string&gt;</code></a> &lt;string&gt;</code></a>
<br />Room name for hidden alarm room (containing only the Alarm device), default: <br />Room name for hidden alarm room (containing only the Alarm device), default:
AlarmRoom</li> AlarmRoom</li>
<li><a name="alarm_hiddenroom"><code>attr &lt;name&gt; hiddenroom <li><a name="alarm_publicroom"><code>attr &lt;name&gt; publicroom
&lt;string&gt;</code></a> &lt;string&gt;</code></a>
<br />Room name for public alarm room (containing sensor/actor devices), default: <br />Room name for public alarm room (containing sensor/actor devices), default:
Alarm</li> Alarm</li>
@ -901,14 +1145,16 @@ sub Alarm_Html($)
locked|unlocked</code></a> locked|unlocked</code></a>
<br /><i>locked</i> means that alarm setups may not be changed, <i>unlocked</i> <br /><i>locked</i> means that alarm setups may not be changed, <i>unlocked</i>
means that alarm setups may be changed></li> means that alarm setups may be changed></li>
<li><a name="alarm_testbutton"><code>attr &lt;name&gt; testbutton 0|1</code></a>
<br /><i>1</i> means that a test button is displayed for every actor field</li>
<li><a name="alarm_statedisplay"><code>attr &lt;name&gt; statedisplay <li><a name="alarm_statedisplay"><code>attr &lt;name&gt; statedisplay
simple,color,table,none</code></a> simple,color,table,none</code></a>
<br />defines how the state of all eight alarm levels is shown. Example for the case <br />defines how the state of all eight alarm levels is shown. Example for the case
when only alarm no. 2 is raised: <ul> when alarm no. 0 is disarmed and only alarm no. 2 is raised: <ul>
<li> simple = OOXOOOOO</li> <li> simple = -OXOOOOO</li>
<li> color = <span style="color:green"> 0 1 <span style="width:1ex;color:red" <li> color = <span style="color:lightgray"> 0 </span><span style="font-weight:bold;color:green">1 <span style="font-weight:bold;color:red"
>2</span> 3 4 5 6 7</span></li> >2</span> 3 4 5 6 7</span></li>
<li> table = HTML mini table with green and red fields for alarms <li> table = HTML mini table with lightgray, green and red fields for alarms
</li> </li>
<li> none = no state display</li> <li> none = no state display</li>
</ul> </ul>
@ -939,6 +1185,7 @@ sub Alarm_Html($)
<a name="Alarm"></a> <a name="Alarm"></a>
<h3>Alarm</h3> <h3>Alarm</h3>
<a href="https://wiki.fhem.de/wiki/Modul_Alarm">Deutsche Dokumentation im Wiki</a> vorhanden, die englische Version gibt es hier: <a href="/fhem/commandref.html#Alarm">Alarm</a>
=end html_DE =end html_DE
=cut =cut

View File

@ -48,7 +48,7 @@ my $deltaT = 65; # Correction time in s
my %Astro; my %Astro;
my %Date; my %Date;
my $astroversion = 1.33; my $astroversion = 1.35;
#-- These we may get on request #-- These we may get on request
my %gets = ( my %gets = (
@ -1058,7 +1058,7 @@ sub Astro_Compute($){
$Astro{ObsLat} = $attr{"global"}{"latitude"}; $Astro{ObsLat} = $attr{"global"}{"latitude"};
}else{ }else{
$Astro{ObsLat} = 50.0; $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"}) ){ if( defined($attr{$name}{"longitude"}) ){
$Astro{ObsLon} = $attr{$name}{"longitude"}; $Astro{ObsLon} = $attr{$name}{"longitude"};
@ -1066,7 +1066,7 @@ sub Astro_Compute($){
$Astro{ObsLon} = $attr{"global"}{"longitude"}; $Astro{ObsLon} = $attr{"global"}{"longitude"};
}else{ }else{
$Astro{ObsLon} = 10.0; $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 #-- altitude of observer in meters above WGS84 ellipsoid
if( defined($attr{$name}{"altitude"}) ){ if( defined($attr{$name}{"altitude"}) ){
@ -1075,14 +1075,14 @@ sub Astro_Compute($){
$Astro{ObsAlt} = $attr{"global"}{"altitude"}; $Astro{ObsAlt} = $attr{"global"}{"altitude"};
}else{ }else{
$Astro{ObsAlt} = 0.0; $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 #-- custom horizon of observer in degrees
if( defined($attr{$name}{"horizon"}) ){ if( defined($attr{$name}{"horizon"}) ){
$Astro{ObsHor} = $attr{$name}{"horizon"}; $Astro{ObsHor} = $attr{$name}{"horizon"};
}else{ }else{
$Astro{ObsHor} = 0.0; $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 #-- internal variables converted to Radians and km
@ -1437,6 +1437,6 @@ sub Astro_Get($@) {
<a name="Astro"></a> <a name="Astro"></a>
<h3>Astro</h3> <h3>Astro</h3>
Keine deutsche Dokumentation vorhanden, die englische Version gibt es hier: <a href="/fhem/docs/commandref.html#Astro">Astro</a> Absichtlich keine deutsche Dokumentation vorhanden, die englische Version gibt es hier: <a href="/fhem/commandref.html#Astro">Astro</a>
=end html_DE =end html_DE
=cut =cut

View File

@ -43,7 +43,7 @@ use Time::Local;
######################### #########################
# Global variables # Global variables
my $postmeversion = "2.03"; my $postmeversion = "2.04";
my $FW_encoding = "UTF-8"; my $FW_encoding = "UTF-8";
######################################################################################### #########################################################################################
@ -145,7 +145,7 @@ sub PostMe_Init($) {
#-- current number of PostMes #-- current number of PostMes
my $cnop = ReadingsVal($devname,"postmeCnt",0); my $cnop = ReadingsVal($devname,"postmeCnt",0);
my @std = split(',',AttrVal("$devname","postmeStd",undef)); my @std = split(',',AttrVal("$devname","postmeStd",""));
for( my $i=0;$i<int(@std);$i++ ){ for( my $i=0;$i<int(@std);$i++ ){
my $pmn = PostMe_Check($hash,$std[$i]); my $pmn = PostMe_Check($hash,$std[$i]);
@ -1517,7 +1517,7 @@ sub PostMe_widget($) {
<br />Defines the PostMe system, &lt;postit&gt; is an arbitrary name for the system. </p> <br />Defines the PostMe system, &lt;postit&gt; is an arbitrary name for the system. </p>
<a name="PostMeusage"></a> <a name="PostMeusage"></a>
<h4>Usage</h4> <h4>Usage</h4>
See <a href="http://www.fhemwiki.de/wiki/Modul_PostMe">Wiki documentation</a> See <a href="http://www.fhemwiki.de/wiki/Modul_PostMe">German Wiki page</a>
<br/> <br/>
An arbitrary number of lists may be added to the system with the <i>create</i> command.<br/> An arbitrary number of lists may be added to the system with the <i>create</i> command.<br/>
List items may consist of one or more words, and are added/removed by the <i>add</i> and List items may consist of one or more words, and are added/removed by the <i>add</i> and
@ -1658,6 +1658,7 @@ sub PostMe_widget($) {
<a name="PostMe"></a> <a name="PostMe"></a>
<h3>PostMe</h3> <h3>PostMe</h3>
<a href="https://wiki.fhem.de/wiki/Modul_PostMe">Deutsche Dokumentation im Wiki</a> vorhanden, die englische Version gibt es hier: <a href="/fhem/commandref.html#PostMe">PostMe</a>
=end html_DE =end html_DE
=cut =cut

View File

@ -48,7 +48,7 @@ my $yaahmname;
my $yaahmlinkname = "Profile"; # link text my $yaahmlinkname = "Profile"; # link text
my $yaahmhiddenroom = "ProfileRoom"; # hidden room my $yaahmhiddenroom = "ProfileRoom"; # hidden room
my $yaahmpublicroom = "Unsorted"; # public room my $yaahmpublicroom = "Unsorted"; # public room
my $yaahmversion = "1.07"; my $yaahmversion = "1.09";
my $firstcall=1; my $firstcall=1;
my %yaahm_transtable_EN = ( my %yaahm_transtable_EN = (
@ -799,7 +799,7 @@ sub YAAHM_Get($@) {
$res .= " }\n}\n"; $res .= " }\n}\n";
return $res; return $res;
} else { } 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]; $val = $a[3];
if( ($val eq "undef")||($val eq "") ){ if( ($val eq "undef")||($val eq "") ){
$val = undef; $val = undef;
}elsif( $val !~ /\d?\d:\d\d/ ){ }elsif( $val =~/^off/ ){
$msg = "wrong time specification next=$val for weekly timer ".$a[1].", must be hh:mm"; #-- ok
Log 1,"[YAAHM_setParm] ".$msg; }elsif( $val =~ /\d?\d:\d\d/ ){
$val = "07:00"; #-- ok
}else{
my ($hour,$min) = split(':',$val); my ($hour,$min) = split(':',$val);
if( $hour>23 || $min>59 ){ if( $hour>23 || $min>59 ){
$msg = "wrong time specification next=$val for weekly timer > 23:59".$a[1]; $msg = "wrong time specification next=$val for weekly timer > 23:59".$a[1];
Log 1,"[YAAHM_setParm] ".$msg; 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]]{"next"} = $val;
$hash->{DATA}{"WT"}[$a[1]]{"acti_m"} = $a[4]; $hash->{DATA}{"WT"}[$a[1]]{"acti_m"} = $a[4];
$hash->{DATA}{"WT"}[$a[1]]{"acti_d"} = $a[5]; $hash->{DATA}{"WT"}[$a[1]]{"acti_d"} = $a[5];
@ -905,20 +909,20 @@ sub YAAHM_setParm($@) {
$val = $a[$i+6]; $val = $a[$i+6];
if( ($val eq "undef")||($val eq "") ){ if( ($val eq "undef")||($val eq "") ){
$val = undef; $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/ ){ }elsif( $val =~/^off/ ){
#-- ok #-- ok
}else{ }elsif( $val =~ /\d?\d:\d\d/ ){
#-- ok #-- ok
my ($hour,$min) = split(':',$val); my ($hour,$min) = split(':',$val);
if( $hour>23 || $min>59 ){ if( $hour>23 || $min>59 ){
$msg = "wrong time specification $val for weekly timer > 23:59 ".$a[1]; $msg = "wrong time specification $val for weekly timer > 23:59 ".$a[1];
Log 1,"[YAAHM_setParm] ".$msg; 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; $hash->{DATA}{"WT"}[$a[1]]{$weeklytable[$i]} = $val;
} }
@ -1011,14 +1015,16 @@ sub YAAHM_time {
readingsBulkUpdate($hash,"tr_housephase",$yaahm_tt->{$targetphase}); readingsBulkUpdate($hash,"tr_housephase",$yaahm_tt->{$targetphase});
readingsEndUpdate($hash,1); readingsEndUpdate($hash,1);
#-- execute function not required by call from external timer #-- helper function not executed, e.g. by call from external timer
return return
if( !defined($exec) ); if( !defined($exec) );
#-- doit #-- execute the helper function
my $xval; my $xval;
my $ival; my $ival;
my $wupn; 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" ){ if( $targettime eq "wakeup" ){
$wupn = $hash->{DATA}{"WT"}[0]{"name"}; $wupn = $hash->{DATA}{"WT"}[0]{"name"};
$ival = (ReadingsVal($name.".wtimer_0.IF","mode","") ne "disabled"); $ival = (ReadingsVal($name.".wtimer_0.IF","mode","") ne "disabled");
@ -1551,7 +1557,7 @@ sub YAAHM_setWeeklyTime($) {
#-- now check if next time is already past #-- now check if next time is already past
my ($sec, $min, $hour, $day, $month, $year, $wday,$yday,$isdst) = localtime(time); my ($sec, $min, $hour, $day, $month, $year, $wday,$yday,$isdst) = localtime(time);
my $lga = sprintf("%02d%02d",$hour,$min); my $lga = sprintf("%02d%02d",$hour,$min);
my $nga = $ng; my $nga = (defined $ng)?$ng:"";
$nga =~ s/://; $nga =~ s/://;
#-- arbitrary today, next off #-- arbitrary today, next off
@ -2335,57 +2341,57 @@ sub YAAHM_timewidget($){
my ($sec, $min, $hour, $day, $month, $year, $wday,$yday,$isdst) = localtime(time); my ($sec, $min, $hour, $day, $month, $year, $wday,$yday,$isdst) = localtime(time);
my $t_now = sprintf("%02d:%02d",$hour,$min); my $t_now = sprintf("%02d:%02d",$hour,$min);
my $a_now = (60*$hour + $min)/1440 * 2 * pi; my $a_now = (60*$hour + $min)/1440 * 2 * pi;
my $x_now = -int(sin($a_now)*$radius*10)/10; my $x_now = -int(sin($a_now)*$radius*100)/100;
my $y_now = int(cos($a_now)*$radius*10)/10; 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"; my $t_sunrise = defined($hash->{DATA}{"DD"}[0]{"sunrise"}) ? $hash->{DATA}{"DD"}[0]{"sunrise"} : "06:00";
$t_sunrise =~ s/^0//; $t_sunrise =~ s/^0//;
($hour,$min) = split(":",$t_sunrise); ($hour,$min) = split(":",$t_sunrise);
my $a_sunrise = (60*$hour + $min)/1440 * 2 * pi; my $a_sunrise = (60*$hour + $min)/1440 * 2 * pi;
my $x_sunrise = -int(sin($a_sunrise)*$radius*10)/10; my $x_sunrise = -int(sin($a_sunrise)*$radius*100)/100;
my $y_sunrise = int(cos($a_sunrise)*$radius*10)/10; 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"; my $t_morning = defined($hash->{DATA}{"DT"}{"morning"}[0]) ? $hash->{DATA}{"DT"}{"morning"}[0] : "08:00";
$t_morning =~ s/^0//; $t_morning =~ s/^0//;
($hour,$min) = split(":",$t_morning); ($hour,$min) = split(":",$t_morning);
my $a_morning = (60*$hour + $min)/1440 * 2 * pi; my $a_morning = (60*$hour + $min)/1440 * 2 * pi;
my $x_morning = -int(sin($a_morning)*$radius*10)/10; my $x_morning = -int(sin($a_morning)*$radius*100)/100;
my $y_morning = int(cos($a_morning)*$radius*10)/10; 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"; my $t_noon = defined($hash->{DATA}{"DT"}{"noon"}[0]) ? $hash->{DATA}{"DT"}{"noon"}[0] : "12:00";
$t_noon =~ s/^0//; $t_noon =~ s/^0//;
($hour,$min) = split(":",$t_noon); ($hour,$min) = split(":",$t_noon);
my $a_noon = (60*$hour + $min)/1440 * 2 * pi; my $a_noon = (60*$hour + $min)/1440 * 2 * pi;
my $x_noon = -int(sin($a_noon)*$radius*10)/10; my $x_noon = -int(sin($a_noon)*$radius*100)/100;
my $y_noon = int(cos($a_noon)*$radius*10)/10; 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"; my $t_afternoon = defined($hash->{DATA}{"DT"}{"afternoon"}[0]) ? $hash->{DATA}{"DT"}{"afternoon"}[0] : "14:00";
$t_afternoon =~ s/^0//; $t_afternoon =~ s/^0//;
($hour,$min) = split(":",$t_afternoon); ($hour,$min) = split(":",$t_afternoon);
my $a_afternoon = (60*$hour + $min)/1440 * 2 * pi; my $a_afternoon = (60*$hour + $min)/1440 * 2 * pi;
my $x_afternoon = -int(sin($a_afternoon)*$radius*10)/10; my $x_afternoon = -int(sin($a_afternoon)*$radius*100)/100;
my $y_afternoon = int(cos($a_afternoon)*$radius*10)/10; 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"; my $t_sunset = defined($hash->{DATA}{"DD"}[0]{"sunset"}) ? $hash->{DATA}{"DD"}[0]{"sunset"} : "18:00";
$t_sunset =~ s/^0//; $t_sunset =~ s/^0//;
($hour,$min) = split(":",$t_sunset); ($hour,$min) = split(":",$t_sunset);
my $a_sunset = (60*$hour + $min)/1440 * 2 * pi; my $a_sunset = (60*$hour + $min)/1440 * 2 * pi;
my $x_sunset = -int(sin($a_sunset)*$radius*10)/10; my $x_sunset = -int(sin($a_sunset)*$radius*100)/100;
my $y_sunset = int(cos($a_sunset)*$radius*10)/10; 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"; my $t_evening = defined($hash->{DATA}{"DT"}{"evening"}[0]) ? $hash->{DATA}{"DT"}{"evening"}[0] : "19:00";
$t_evening =~ s/^0//; $t_evening =~ s/^0//;
($hour,$min) = split(":",$t_evening); ($hour,$min) = split(":",$t_evening);
my $a_evening = (60*$hour + $min)/1440 * 2 * pi; my $a_evening = (60*$hour + $min)/1440 * 2 * pi;
my $x_evening = -int(sin($a_evening)*$radius*10)/10; my $x_evening = -int(sin($a_evening)*$radius*100)/100;
my $y_evening = int(cos($a_evening)*$radius*10)/10; 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"; my $t_night = defined($hash->{DATA}{"DT"}{"night"}[0]) ? $hash->{DATA}{"DT"}{"night"}[0] : "22:00";
$t_night =~ s/^0//; $t_night =~ s/^0//;
($hour,$min) = split(":",$t_night); ($hour,$min) = split(":",$t_night);
my $a_night = (60*$hour + $min)/1440 * 2 * pi; my $a_night = (60*$hour + $min)/1440 * 2 * pi;
my $x_night = -int(sin($a_night)*$radius*10)/10; my $x_night = -int(sin($a_night)*$radius*100)/100;
my $y_night = int(cos($a_night)*$radius*10)/10; my $y_night = int(cos($a_night)*$radius*100)/100;
FW_pO '<defs>'. FW_pO '<defs>'.
sprintf('<linearGradient id="grad1" x1="0%%" y1="0%%" x2="%d%%" y2="%d%%">',int(-$x_noon/$radius*100),int(-$y_noon/$radius*100)). sprintf('<linearGradient id="grad1" x1="0%%" y1="0%%" x2="%d%%" y2="%d%%">',int(-$x_noon/$radius*100),int(-$y_noon/$radius*100)).
'<stop offset="0%" style="stop-color:rgb(255,255,0);stop-opacity:1" />'. '<stop offset="0%" style="stop-color:rgb(255,255,0);stop-opacity:1" />'.
@ -2914,7 +2920,11 @@ sub YAAHM_Longtable($){
<a name="YAAHM"></a> <a name="YAAHM"></a>
<h3>YAAHM</h3> <h3>YAAHM</h3>
<p> Yet Another Auto Home Module to set up a cyclic processing of commands (daily, weekly, monthly, yearly profile). See German Wiki page at <a href="/fhem/docs/commandref.html#YAAHM">YAAHM</a></p> <p> Yet Another Auto Home Module to set up a cyclic processing of commands (daily, weekly, monthly, yearly profile)</p>
<a name="YAAHMusage"></a>
<h4>Usage</h4>
See <a href="http://www.fhemwiki.de/wiki/Modul_YAAHM">German Wiki page</a>
<br/>
<a name="YAAHMdefine"></a> <a name="YAAHMdefine"></a>
<h4>Define</h4> <h4>Define</h4>
<p> <p>
@ -3065,6 +3075,6 @@ sub YAAHM_Longtable($){
<a name="YAAHM"></a> <a name="YAAHM"></a>
<h3>YAAHM</h3> <h3>YAAHM</h3>
<a href="https://wiki.fhem.de/wiki/Modul_YAAHM">Deutsche Dokumentation im Wiki</a> vorhanden, die englische Version gibt es hier: <a href="/fhem/docs/commandref.html#YAAHM">YAAHM</a> <a href="https://wiki.fhem.de/wiki/Modul_YAAHM">Deutsche Dokumentation im Wiki</a> vorhanden, die englische Version gibt es hier: <a href="/fhem/commandref.html#YAAHM">YAAHM</a>
=end html_DE =end html_DE
=cut =cut