Hauptmenü

DOIF und WAIT

Begonnen von Chris8888, 26 Mai 2017, 09:46:39

Vorheriges Thema - Nächstes Thema

Chris8888

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)

FHEM 6.0 auf einem PI4 mit div. Homematic-Komponenten, Alexa, Tablet-UI und Homebridge...und läuft einfach. Erweitert mit CCU3 und Homematic-IP...und läuft immer noch.

Damian

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.

Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

rabehd

nur so eine Idee.

Wie wäre es mit der Durchschnittshelligkeit der letzten x Minuten?
Auch funktionierende Lösungen kann man hinterfragen.

Chris8888

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
FHEM 6.0 auf einem PI4 mit div. Homematic-Komponenten, Alexa, Tablet-UI und Homebridge...und läuft einfach. Erweitert mit CCU3 und Homematic-IP...und läuft immer noch.

rabehd

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.
Auch funktionierende Lösungen kann man hinterfragen.

TomLee

Wenn ich dein Vorhaben richtig verstehe und mein Doif hier.

Sollte doch

attr wait 900:900:900:900
attr do always


eine weitere Lösung sein !?

Chris8888

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
FHEM 6.0 auf einem PI4 mit div. Homematic-Komponenten, Alexa, Tablet-UI und Homebridge...und läuft einfach. Erweitert mit CCU3 und Homematic-IP...und läuft immer noch.

Axel74

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?

Damian

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)
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Axel74

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)