Hallo zusammen,
ich versuche gerade eine Beschattungsfunktion u.a. über einen Lichtmesser per DOIF umzusetzen.
Da ich natürlich nicht bei jeder Wolke die Rollos wieder hoch fahren möchte, habe ich ein "attr wait 900" ergänzt.
Dies führt aber nicht zum gewünschten Erfolg. Wenn ich das richtig verstehe, so wird der Timer nur bei Eintritt eines anderen Bedingungszweiges abgebrochen. Ich würde aber gerne den Timer stoppen wenn die Argumente wieder false sind. Also zB Licht nicht mehr < 20000 Lux.
Wie könnte ich das angehen?
Besten Dank vorab für eure Hilfe!
VG
Christian
Hier eines der DOIFs:
([11:00-19:00] and [Aussenthermometer:temperature] > 24 and [myTL:azimuth] > 170 and [Wetterstation:luminosity2] > 25000 and [?Terrassentuer1] eq "closed" and ([?RolloTerassenTuerWZ] eq "on" or [?RolloTerassenTuerWZ:pct] > 30))
(set RolloTerassenTuerWZ:FILTER=state!="30" 30)
DOELSEIF
([11:00-19:00] and [Aussenthermometer:temperature] > 24 and [myTL:azimuth] > 170 and [Wetterstation:luminosity2] > 25000 and [?Terrassentuer1] eq "open" and ([?RolloTerassenTuerWZ] eq "on" or [?RolloTerassenTuerWZ:pct] > 30))
(setreading RolloTerassenTuerWZ last_state 30)
DOELSEIF
([11:00-19:00] and ([Aussenthermometer:temperature] < 24 or [Wetterstation:luminosity2] < 20000) and [?Terrassentuer1] eq "closed" and [?RolloTerassenTuerWZ:last_state] ne "30")
(set RolloTerassenTuerWZ:FILTER=state!=on [RolloTerassenTuerWZ:last_state])
DOELSEIF
([11:00-19:00] and ([Aussenthermometer:temperature] < 24 or [Wetterstation:luminosity2] < 20000) and [?Terrassentuer1] eq "closed" and [?RolloTerassenTuerWZ:last_state] eq "30")
(set RolloTerassenTuerWZ on)
Zitat von: Chris8888 am 26 Mai 2017, 09:46:39
Hallo zusammen,
ich versuche gerade eine Beschattungsfunktion u.a. über einen Lichtmesser per DOIF umzusetzen.
Da ich natürlich nicht bei jeder Wolke die Rollos wieder hoch fahren möchte, habe ich ein "attr wait 900" ergänzt.
Dies führt aber nicht zum gewünschten Erfolg. Wenn ich das richtig verstehe, so wird der Timer nur bei Eintritt eines anderen Bedingungszweiges abgebrochen. Ich würde aber gerne den Timer stoppen wenn die Argumente wieder false sind. Also zB Licht nicht mehr < 20000 Lux.
Wie könnte ich das angehen?
Der Wait-Timer wird nur beim Zustandswechsel abgebrochen. Du musst also dafür sorgen, dass du einen Zustand bei Nicht-Erfüllung hast, vermutlich reicht bei deiner Definition schon ein DOELSE am Ende ohne weitere Angaben.
nur so eine Idee.
Wie wäre es mit der Durchschnittshelligkeit der letzten x Minuten?
Hallo Damian,
danke für die schnelle Antwort und die Erklärung.
Das DOELSE war schnell ergänzt und ich teste nun. :-)
Bisher sieht es super aus.
@rabehd: auch eine Idee...aber wie sollte ich den Wert ermitteln? Mein Sensor überträgt alle 3-4 Minuten.
Viele Grüße
Christian
my $avg = myAverage("604800", "logdb", "Wetterstation:temperature::");
Bildet bei mir den Wochendurchschnitt der Temperatur.
# myAverage
# berechnet den Mittelwert aus LogFiles über einen beliebigen Zeitraum
sub myAverage($$$)
{
my ($offset,$logfile,$cspec) = @_;
my $period_s = strftime "%Y-%m-%d\x5f%H:%M:%S", localtime(time-$offset);
my $period_e = strftime "%Y-%m-%d\x5f%H:%M:%S", localtime(time+2);
my $oll = $attr{global}{verbose};
$attr{global}{verbose} = 0;
my @logdata = split("\n", fhem("get $logfile - - $period_s $period_e $cspec"));
Log 3, "get " . $logfile ." - - " . $period_s . " " . $period_e . " " . $cspec;
$attr{global}{verbose} = $oll;
my ($cnt, $cum, $avg) = (0)x3;
foreach (@logdata)
{
my @line = split(" ", $_);
if(defined $line[1] && "$line[1]" ne ""){
$cnt += 1;
$cum += $line[1];
}
}
if("$cnt" > 0){$avg = sprintf("%0.1f", $cum/$cnt)};
Log 4, ("myAverage: File: $logfile, Field: $cspec, Period: $period_s bis $period_e, Count: $cnt, Cum: $cum, Average: $avg");
return $avg;
}
Ich habe das hier irgendwo gefunden und angepasst.
Meine Logs stehen in einer DBLog, ging vorher aber auch mit Logfile.
Wenn ich dein Vorhaben richtig verstehe und mein Doif hier (https://forum.fhem.de/index.php/topic,57247.0.html).
Sollte doch
attr wait 900:900:900:900
attr do always
eine weitere Lösung sein !?
Hallo zusammen,
das DOELSE war die Lösung. Läuft super so! Besten Dank nochmal.
@TomLee: Das hatte (und habe) ich so schon. Aber bei Helligkeitsschwankungen >20000 aber <25000 wurde der Timer nicht abgebrochen, da keine Bedingung erfüllt war.
VG
Christian
Hallo
Ich habe eine Frage zu einem ähnlichen Thema.
Ich möchte per DOIF und WAIT meine Wohnzimmerlampe verzögert ausschalten wenn der Sonoff-Pow meldet, dass der Fernseher aus ist.
Folgendes habe ich programmiert:
Define AmbienteBeleuchtung DOIF (([Sonoff_Pow01:PowerHigh] eq "ON") and ([T:light] < 5)) (set Wohnzimmer_Fernseher_Status An,set Sonoff_Switch02 on) DOELSEIF ([Sonoff_Pow01:PowerLow] eq "ON") ((set Wohnzimmer_Fernseher_Status Aus),(set Sonoff_Switch02 off))
attr AmbienteBeleuchtung wait 0:0,300
Leider geht die Lampe immer sofort mit dem Fernseher aus.
Kann mir jemand sagen, warum das WAIT nicht funktioniert?
falsch geklammert, richtig:
define AmbienteBeleuchtung DOIF (([Sonoff_Pow01:PowerHigh] eq "ON") and ([T:light] < 5)) (set Wohnzimmer_Fernseher_Status An,set Sonoff_Switch02 on) DOELSEIF ([Sonoff_Pow01:PowerLow] eq "ON") (set Wohnzimmer_Fernseher_Status Aus)(set Sonoff_Switch02 off)
Hallo Damian
Vielen Dank für die schnelle Antwort. So funktioniert es! :-)
Jetzt muste ich den Code nur noch anpassen, damit die Lampe nicht auch nach 5min von alleine ausgeht, wenn ich sie ohne den Fernseher angeschaltet habe:
DOIF (([Sonoff_Pow01:PowerHigh] eq "ON") and ([T:light] < 5)) (set Wohnzimmer_Fernseher_Status An,set Sonoff_Switch02 on) DOELSEIF (([Wohnzimmer_Fernseher_Status] eq "An") and ([Sonoff_Pow01:PowerLow] eq "ON")) (set Wohnzimmer_Fernseher_Status Aus)(set Sonoff_Switch02 off)