|
From: <pf...@us...> - 2012-05-18 05:05:39
|
Revision: 828
http://openautomation.svn.sourceforge.net/openautomation/?rev=828&view=rev
Author: pfry
Date: 2012-05-18 05:05:32 +0000 (Fri, 18 May 2012)
Log Message:
-----------
Weitere Parameter "date" f?\195?\188r Timer, Wort "Achtung" f?\195?\188r MissGoogle
Modified Paths:
--------------
wiregate/plugin/generic/Logikprozessor.pl
wiregate/plugin/generic/MissGoogle.pl
wiregate/plugin/generic/conf.d/Logikprozessor.conf
Modified: wiregate/plugin/generic/Logikprozessor.pl
===================================================================
--- wiregate/plugin/generic/Logikprozessor.pl 2012-05-17 20:56:56 UTC (rev 827)
+++ wiregate/plugin/generic/Logikprozessor.pl 2012-05-18 05:05:32 UTC (rev 828)
@@ -48,6 +48,7 @@
my $day=($hour>7 && $hour<23);
my $night=!$day;
my $systemtime=time();
+my $date=sprintf("%02d/%02d",$month,$day_of_month);
# Konfigurationsfile einlesen
my $eibd_backend_address='1.1.254';
@@ -373,7 +374,7 @@
$d->{month} = 1 if $d->{month}==13;
$d->{day_of_year} = ($d->{day_of_year} % (365+$leapyear))+1;
$d->{year} += ($d->{day_of_month}==1 && $d->{month}==1);
-
+
add_day_info($d);
return $d;
@@ -413,12 +414,13 @@
sub add_day_info
{
- my $day=shift;
+ my $d=shift;
- $day->{weekend}=($day->{day_of_week_no}>=6);
- $day->{weekday}=!$day->{weekend};
- $day->{holiday}=is_holiday($day->{year},$day->{day_of_year});
- $day->{workingday}=(!$day->{weekend} && !$day->{holiday});
+ $d->{weekend}=($d->{day_of_week_no}>=6);
+ $d->{weekday}=!$d->{weekend};
+ $d->{holiday}=is_holiday($d->{year},$d->{day_of_year});
+ $d->{workingday}=(!$d->{weekend} && !$d->{holiday});
+ $d->{date} = sprintf("%02d/%02d",$d->{month},$d->{day_of_month});
}
# Passt ein bestimmtes Datum auf das Schema in einer "Schedule"?
@@ -443,130 +445,172 @@
return $match;
}
-# Fuer eine bestimmte Timer-Logik den naechsten Aufruf berechnen (relativ komplexes Problem wegen der
-# vielen moeglichen Konfigurationen und Konstellationen)
-sub set_next_call
+
+sub standardize_and_expand_single_schedule
{
- my ($t,$debug)=@_; # der relevante Eintrag in %logic, und das Debugflag
- my $nextcall=undef;
- my $days_until_nextcall=0;
-
- # $logic{$t}{timer} ist eine Liste oder ein einzelner Eintrag
- # jeder solche Eintrag ist ein Hash im Format
- # {day_of_month=>[(1..7)],day_of_week=>'Mo',time=>['08:30','09:20']}
- # das gerade genannte Beispiel bedeutet "jeden Monat jeweils der erster Montag, 8:30 oder 9:20"
- # verwendbare Klauseln sind year, month, day_of_month, calendar_week, day_of_week und time
- # Pflichtfeld ist lediglich time, die anderen duerfen auch entfallen.
- # Jeder Wert darf ein Einzelwert oder eine Liste sein.
- my $schedule=$logic{$t}{timer};
- my $today={year=>$year,day_of_year=>$day_of_year,month=>$month,day_of_month=>$day_of_month,
- calendar_week=>$calendar_week,day_of_week=>$day_of_week_no};
- add_day_info($today);
-
- my $time_of_day=`/bin/date +"%X"`;
-
- # Schedule-Form standardisieren (alle Eintraege in Listenform setzen und Wochentage durch Zahlen ersetzen)
- # dabei gleich schauen, ob HEUTE noch ein Termin ansteht
- $schedule=[$schedule] if ref $schedule eq 'HASH';
+ my ($t,$s)=@_;
+ my @days_in_month=(0,31,29,31,30,31,30,31,31,30,31,30,31); # hier ist jedes Jahr ein Schaltjahr
my %weekday=(Mo=>1,Mo=>1,Mon=>1,Di=>2,Tu=>2,Tue=>2,Mi=>3,We=>3,Wed=>3,Do=>4,Th=>4,Thu=>4,Fr=>5,Fri=>5,Sa=>6,Sat=>6,So=>7,Su=>7,Sun=>7);
- for my $s (@{$schedule})
+ # Timereintrag pruefen und standardisieren
+ unless(ref $s eq 'HASH')
{
- # Timereintrag pruefen und standardisieren
- unless(ref $s eq 'HASH')
+ plugin_log($plugname, "Logiktimer zu Logik '$t' ist kein Hash oder Liste von Hashes");
+ next;
+ }
+
+ unless(defined $s->{time})
+ {
+ plugin_log($plugname, "Logiktimer zu Logik '$t' enthaelt mindestens einen Eintrag ohne Zeitangabe (time=>...)");
+ next;
+ }
+
+ # Eintrag pruefen und standardisieren
+ for my $k (keys %{$s})
+ {
+ unless($k=~/^(year|month|calendar_week|day_of_year|day_of_month|day_of_week|date|holiday|weekend|weekday|workingday|time)$/)
{
- plugin_log($plugname, "Logiktimer zu Logik '$t' ist kein Hash oder Liste von Hashes");
+ plugin_log($plugname, "Logiktimer zu Logik '$t': Unerlaubter Eintrag '$k'; erlaubt sind year, month, calendar_week, day_of_year, day_of_month, day_of_week, date, weekend, weekday, holiday, workingday, und Pflichteintrag ist time");
next;
}
- unless(defined $s->{time})
+ if($k=~/^(holiday|weekend|weekday|workingday)$/ && $s->{$k}!~/^(0|1)$/)
{
- plugin_log($plugname, "Logiktimer zu Logik '$t' enthaelt mindestens einen Eintrag ohne Zeitangabe (time=>...)");
+ plugin_log($plugname, "Logiktimer zu Logik '$t': Unerlaubter Wert '$k\->$s->{$k}': erlaubt sind 0 und 1");
next;
- }
-
- # Eintrag pruefen und standardisieren
- for my $k (keys %{$s})
+ }
+
+ unless(!ref $s->{$k} || ref $s->{$k} eq 'ARRAY')
{
- unless($k=~/^(year|month|calendar_week|day_of_year|day_of_month|day_of_week|holiday|weekend|weekday|workingday|time)$/)
+ plugin_log($plugname, "Logiktimer zu Logik '$t': '$k' muss auf Skalar oder Array ($k=>[...]) verweisen");
+ next;
+ }
+
+ $s->{$k}=[$s->{$k}] unless ref $s->{$k} eq 'ARRAY'; # alle Kategorien in Listenform
+
+ if($k eq 'day_of_week')
+ {
+ for my $wd (sort { length($b) cmp length($a) } keys %weekday)
{
- plugin_log($plugname, "Logiktimer zu Logik '$t': Unerlaubter Eintrag '$k'; erlaubt sind year, month, calendar_week, day_of_year, day_of_month, day_of_week, weekend, weekday, holiday, workingday, und Pflichteintrag ist time");
- next;
+ foreach (@{$s->{$k}}) { s/$wd/$weekday{$wd}/gie } # Wochentage in Zahlenform
}
-
- unless(!ref $s->{$k} || ref $s->{$k} eq 'ARRAY')
+ }
+
+ # Expandieren von Bereichen, z.B. month=>'3-5'
+ if($k!~/^(time|date)$/ && grep /\-/, @{$s->{$k}})
+ {
+ my $newlist=[];
+ for my $ks (@{$s->{$k}})
{
- plugin_log($plugname, "Logiktimer zu Logik '$t': '$k' muss auf Skalar oder Array ($k=>[...]) verweisen");
- next;
- }
-
- $s->{$k}=[$s->{$k}] unless ref $s->{$k} eq 'ARRAY'; # alle Kategorien in Listenform
-
- if($k eq 'day_of_week')
- {
- for my $wd (sort { length($b) cmp length($a) } keys %weekday)
+ if($ks=~/^([0-9]+)\-([0-9]+)$/)
{
- foreach (@{$s->{$k}}) { s/$wd/$weekday{$wd}/gie } # Wochentage in Zahlenform
+ push @{$newlist}, ($1..$2);
}
+ else
+ {
+ push @{$newlist}, $ks;
+ }
}
-
- # Expandieren von Bereichen, z.B. month=>'3-5'
- if($k ne 'time' && grep /\-/, @{$s->{$k}})
+ @{$s->{$k}} = sort @{$newlist};
+# plugin_log($plugname, "\$logic{$t} Aufrufdaten $k: ".join " ", @{$s->{$k}});
+ }
+ elsif($k eq 'date')
+ {
+ my $newlist=[];
+ for my $ks (@{$s->{date}})
{
- my $newlist=[];
- for my $ks (@{$s->{$k}})
+ if($ks=~/^([0-9]+)\/([0-9]+)\-([0-9]+)\/([0-9]+)$/)
{
- if($ks=~/^([0-9]+)\-([0-9]+)$/)
+ my ($m1,$d1,$m2,$d2)=($1,$2,$3,$4);
+ while($m1<$m2 || ($m1==$m2 && $d1<$d2))
{
- push @{$newlist}, ($1..$2);
+ push @{$newlist}, sprintf("%02d\/%02d",$m1,$d1);
+ if($d1==$days_in_month[$m1]) { $m1++; $d1=1; } else { $d1++; }
}
- else
- {
- push @{$newlist}, $ks;
- }
}
- @{$s->{$k}} = sort @{$newlist};
-# plugin_log($plugname, "\$logic{$t} Aufrufdaten $k: ".join " ", @{$s->{$k}});
- }
- else
- {
- @{$s->{$k}}=sort @{$s->{$k}}; # alle Listen sortieren
+ elsif($ks=~s/([0-9]+)\/([0-9]+)/sprintf("%02d\/%02d",$1,$2)/ge)
+ {
+ push @{$newlist}, $ks;
+ }
+ else
+ {
+ plugin_log($plugname, "Logiktimer zu Logik '$t': unerlaubte Datumsangabe date->$ks (erlaubt sind Einzeleintraege wie '02/03' oder Bereich wie '02/28-03/15')");
+ }
}
+ @{$s->{date}} = sort @{$newlist};
+# plugin_log($plugname, "\$logic{$t} Aufrufdaten date: ".join " ", @{$s->{date}});
}
-
- # Expandieren periodischer Zeitangaben, das sind Zeitangaben der Form
- # time=>'08:00+30min' - ab 08:00 alle 30min
- # time=>'08:00+5min-09:00' - ab 08:00 alle 5min mit Ende 09:00
- if(grep /\+/, @{$s->{time}})
+ else
{
- my $newtime=[];
- for my $ts (@{$s->{time}})
+ @{$s->{$k}}=sort @{$s->{$k}}; # alle Listen sortieren
+ }
+ }
+
+ # Expandieren periodischer Zeitangaben, das sind Zeitangaben der Form
+ # time=>'08:00+30min' - ab 08:00 alle 30min
+ # time=>'08:00+5min-09:00' - ab 08:00 alle 5min mit Ende 09:00
+ if(grep /\+/, @{$s->{time}})
+ {
+ my $newtime=[];
+ for my $ts (@{$s->{time}})
+ {
+ unless($ts=~/^(.*?)([0-9][0-9]):([0-9][0-9])\+([1-9][0-9]*)(m|h)(?:\-([0-9][0-9]):([0-9][0-9]))?$/)
{
- unless($ts=~/^(.*?)([0-9][0-9]):([0-9][0-9])\+([1-9][0-9]*)(m|h)(?:\-([0-9][0-9]):([0-9][0-9]))?$/)
+ if($ts=~/^(.*?)([0-9][0-9]):([0-9][0-9])$/)
{
- if($ts=~/^(.*?)([0-9][0-9]):([0-9][0-9])$/)
- {
- push @{$newtime}, sprintf("%02d:%02d",$2, $3);
- }
- else
- {
- plugin_log($plugname, "Ignoriere falschen time-Eintrag in \$logic{$t}{timer}: '$ts' (Format ist nicht XX:XX)");
- next;
- }
+ push @{$newtime}, sprintf("%02d:%02d",$2, $3);
}
else
{
- my ($head,$t1,$period,$t2)=($1,$2*60+$3,$4*($5 eq 'h' ? 60 : 1),(defined $6 ? ($6*60+$7) : 24*60));
-
- for(my $tm=$t1; $tm<=$t2; $tm+=$period)
- {
- push @{$newtime}, sprintf("%02d:%02d",$tm/60,$tm%60);
- }
+ plugin_log($plugname, "Logiktimer zu Logik '$t': Unerlaubter time-Eintrag '$ts' (erlaubt sind Eintraege wie '14:05' oder '07:30+30m-14:30' oder '07:30+5m-08:00')");
+ next;
}
}
- @{$s->{time}} = sort @{$newtime};
+ else
+ {
+ my ($head,$t1,$period,$t2)=($1,$2*60+$3,$4*($5 eq 'h' ? 60 : 1),(defined $6 ? ($6*60+$7) : 24*60));
+
+ for(my $tm=$t1; $tm<=$t2; $tm+=$period)
+ {
+ push @{$newtime}, sprintf("%02d:%02d",$tm/60,$tm%60);
+ }
+ }
+ }
+ @{$s->{time}} = sort @{$newtime};
# plugin_log($plugname, "\$logic{$t} Aufrufzeiten: ".join " ", @{$newtime});
- }
+ }
+}
+
+
+# Fuer eine bestimmte Timer-Logik den naechsten Aufruf berechnen (relativ komplexes Problem wegen der
+# vielen moeglichen Konfigurationen und Konstellationen)
+sub set_next_call
+{
+ my ($t,$debug)=@_; # der relevante Eintrag in %logic, und das Debugflag
+ my $nextcall=undef;
+ my $days_until_nextcall=0;
+
+ # $logic{$t}{timer} ist eine Liste oder ein einzelner Eintrag
+ # jeder solche Eintrag ist ein Hash im Format
+ # {day_of_month=>[(1..7)],day_of_week=>'Mo',time=>['08:30','09:20']}
+ # das gerade genannte Beispiel bedeutet "jeden Monat jeweils der erster Montag, 8:30 oder 9:20"
+ # verwendbare Klauseln sind year, month, day_of_month, calendar_week, day_of_week und time
+ # Pflichtfeld ist lediglich time, die anderen duerfen auch entfallen.
+ # Jeder Wert darf ein Einzelwert oder eine Liste sein.
+ my $schedule=$logic{$t}{timer};
+ my $today={year=>$year,day_of_year=>$day_of_year,month=>$month,day_of_month=>$day_of_month,
+ calendar_week=>$calendar_week,day_of_week=>$day_of_week_no};
+ add_day_info($today);
+
+ my $time_of_day=`/bin/date +"%X"`;
+
+ # Schedule-Form standardisieren (alle Eintraege in Listenform setzen und Wochentage durch Zahlen ersetzen)
+ # dabei gleich schauen, ob HEUTE noch ein Termin ansteht
+ $schedule=[$schedule] if ref $schedule eq 'HASH';
+
+ for my $s (@{$schedule})
+ {
+ standardize_and_expand_single_schedule($t,$s);
# Steht heute aus diesem Schedule noch ein Termin an?
next unless schedule_matches_day($s,$today) && $s->{time}[-1] gt $time_of_day;
Modified: wiregate/plugin/generic/MissGoogle.pl
===================================================================
--- wiregate/plugin/generic/MissGoogle.pl 2012-05-17 20:56:56 UTC (rev 827)
+++ wiregate/plugin/generic/MissGoogle.pl 2012-05-18 05:05:32 UTC (rev 828)
@@ -12,6 +12,7 @@
"./Achtung Einbruch.wav"=>"Achtung Einbruch Verlassen Sie sofort das Haus",
"./AufWiedersehen.wav"=>"Auf Wiedersehen",
"./Tschuess.wav"=>"tschuess",
+ "./Achtung.wav"=>"Achtung",
"./Ciao.wav"=>"tschau",
"./Bitte Schluesselbund ans Schluesselbrett haengen.wav"=>"Bitte Schluesselbund ans Schluesselbrett haengen",
"./Der Trockner ist fertig.wav"=>"Der Trockner ist fertig",
Modified: wiregate/plugin/generic/conf.d/Logikprozessor.conf
===================================================================
--- wiregate/plugin/generic/conf.d/Logikprozessor.conf 2012-05-17 20:56:56 UTC (rev 827)
+++ wiregate/plugin/generic/conf.d/Logikprozessor.conf 2012-05-18 05:05:32 UTC (rev 828)
@@ -63,7 +63,7 @@
# 6. Eine Logik, die einem Lichtanschalten gleich einen Dimmwert hinterherfeuert, und zwar tags und nachts einen verschiedenen:
dim => { receive=>'2/2/9', transmit=>'2/3/9', translate => sub { return unless $input; $day ? 80 : 3; } },
# Die Variablen $day_of_week (Mo...So), $calendar_week, $day_of_month (01-31), $month (01-12), $day_of_year (1-366),
- # $year (2012), $weekend (0 oder 1), $weekday (= nicht $weekend), $holiday (0 oder 1),
+ # $year (2012), $date ('01/01'-'12/31'), $weekend (0 oder 1), $weekday (= nicht $weekend), $holiday (0 oder 1),
# $workingday (=nicht $weekend und nicht $holiday), $time_of_day ("08:34:02"),
# $hour ("08"), $day (1 falls zwischen 7 und 23 Uhr, 0 sonst) und $night (entsprechend umgekehrt)
# sind f\xFCr diese Logiken vorbesetzt (bitte nicht darauf schreiben, koennte unverhergesehene Auswirkungen
@@ -91,7 +91,7 @@
# um 08:00, um 10:00, zwischen 09:00 und 09:30 alle 2min und zwischen 18:00 und 20:00 jede volle Stunde
# eine 1 auf Transmit sendet
wecker => { transmit=>'10/1/15', timer=>{ time=>['08:00','10:00','09:00+2m-09:30','18:00+1h-20:00'],
- day_of_month=>[(8..14)], day_of_week=>'Di' }, translate => 1 },
+ day_of_month=>'8..14', day_of_week=>'Di' }, translate => 1 },
# Logiken mit timer-Klausel weichen in mehreren Punkten von den bisherigen Logiken ab:
# * sie ignorieren die delay-Klausel und die cool-Klausel
# * Die transmit_only_on_request-Klausel funktioniert aber
@@ -102,9 +102,9 @@
# time=>[{...},{...},{...},...].
# * Jeder Eintrag MUSS eine Spezifikation time=>... (Varianten siehe Beispiel oben) enthalten.
# * Jeder Eintrag DARF zusaetzliche, die Geltungstage einschraenkende Klauseln wie year, month, day_of_year,
- # day_of_month, calendar_week, day_of_week (Mo...So oder Mon...Sun oder 1...7) enthalten. Solche Eintr\xE4ge duerfen
- # Einzelwerte sein (year=>2012), Bereiche (day_of_month=>'8-14') oder auch wieder Listen von Werten/Bereichen.
- # als auch Listen von sein.
+ # day_of_month, calendar_week, day_of_week (Mo...So oder Mon...Sun oder 1...7) und date (Format 'MM/DD') enthalten.
+ # Solche Eintr\xE4ge duerfen Einzelwerte sein (year=>2012), Bereiche (day_of_month=>'8-14') oder auch wieder Listen
+ # von Werten/Bereichen.
# * Jeder Eintrag DARF zusaetzliche binaere (0 oder 1) Einschraenkungen enthalten: weekend, weekday,
# holiday und workingday (=weder holiday noch weekend). holiday beruecksichtigt dabei Neujahr, 1. Mai,
# 3. Oktober, Weihnachten/Ostern/Pfingsten, Christi Himmelfahrt und Fronleichnam als Feiertage.
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|