FHEM Forum

FHEM => Codeschnipsel => Thema gestartet von: igami am 19 Dezember 2015, 14:36:08

Titel: (gelöst) uzsu Zeitraum auswerten
Beitrag von: igami am 19 Dezember 2015, 14:36:08
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;
}