(gelöst) uzsu Zeitraum auswerten

Begonnen von igami, 19 Dezember 2015, 14:36:08

Vorheriges Thema - Nächstes Thema

igami

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;
}

Pi3 mit fhem.cfg + DbLog/logProxy
Komm vorbei zum FHEM Treffen im Kreis Gütersloh! Das nächste Mal im April 2020.

MAINTAINER: archetype, LuftdatenInfo, monitoring, msgDialog, Nmap, powerMap
ToDo: AVScene, FluxLED