Hallo zusammen,
momentan bastel ich daran auszuwerten ob der aktuelle Zeitpunkt inkl. Wochentag in einem Zeitraum ist, der mittels uzsu angegeben ist.
das uzsu Reading könnte etwa so aussehen:
Mo,Di,Mi,Do,Fr|06:00|enabled
Mo,Di,Mi,Do,Fr|09:00|disabled
Mo,Di,Mi,Do,Fr|17:00|enabled
Mo,Di,Mi,Do,Fr|22:00|disabled
Sa,So|06:00|enabled
Sa,So|13:00|disabled
nun bräuchte ich eine sub die entweder enabled oder disabled zurück liefert.
Hat das schon mal wer programmiert?
Grüße
igami
Habe es nun so gelöst
sub uzsu_interval($$$$$) {
my ($name, $reading, $wday, $hour, $min) = @_;
my $hm = sprintf("%02d:%02d", $hour, $min);
my @uzsu;
foreach (split(" ", ReadingsVal($name, $reading, undef))){
my @entry = split(/\|/, $_, 3); #days time state
return if(int(@entry) != 3);
foreach my $day (split(",", $entry[0])){
$day = weekday2number($day);
push @uzsu, "$day $entry[1] $entry[2]";
}
}
@uzsu = sort(@uzsu);
my @first = split(" ", $uzsu[0]);
my @last = split(" ", $uzsu[-1]);
push @uzsu, "- $last[1] $last[2]";
push @uzsu, "9 $first[1] $first[2]";
@uzsu = sort(@uzsu);
my $dhm = "$wday $hm";
for (my $i = 0; $i < @uzsu ; $i++) {
my $j = $i < @uzsu?$i + 1:0;
if($dhm ge $uzsu[$i] and $dhm lt $uzsu[$j]){
my $next = (split(" ", $uzsu[$j]))[1];
my $ret = (split(" ", $uzsu[$i]))[2];
fhem("sleep 0.001; set $name:FILTER=next!=$next next $next; trigger $name $ret");
return $ret;
}
}
}
sub weekday2number($) {
my $weekdays = shift;
my %weekdaymap = ("So" => 0, "Mo" => 1, "Di" => 2, "Mi" => 3, "Do" => 4, "Fr" => 5, "Sa" => 6, "WE" => 7, "!WE" => 8);
my $weekdaykeys = join("|", keys(%weekdaymap));
$weekdays =~ s/($weekdaykeys)/$weekdaymap{$1}/g;
$weekdays =~ s/,//g;
return $weekdays;
}