[gelöst] Disko im Bad - DOIF im Loop

Begonnen von SWhof321, 04 August 2020, 22:38:35

Vorheriges Thema - Nächstes Thema

SWhof321

Hallo zusammen,

ich habe ein totales Anfängerproblem:

Das FHEM empfängt über MQTT von einem Toogle Schalter das Signal wenn dieser gedrückt wurde.
Das lese ich in einem DOIF aus und schalte die Lampe dann entweder an, wenn sie auf war oder eben aus, wenn sie an war.

{if(ReadingsVal("badTaster","0_event","") eq "S" and [badDimmer:state] eq "on") {
   fhem_set "badDimmer off" }
elsif(ReadingsVal("badTaster","0_event","") eq "S" and [badDimmer:state] eq "off") {
   fhem_set "badDimmer on"}
}

Nur, wenn ich das DOIF aktiviere bekomme ich eine Disko, weil die Bedingung des einen Blocks eben auch erfüllt wird, wenn der Befehl des jeweils andere Blocks ausgeführt wird.
Was muss ich einstellen, damit das DOIF nur getriggert wird, wenn sich das Reading bei "badTaster" aktualisiert wird, nicht aber der Status von "badDimmer". Vermutlich irgendein "on-update" Attribute, aber welches und wo?

Ich hatte schonmal eine Variante, wo statt des Blocks "ReadingsVal..." der State eines Dummies abgefragt wurde. Da gab es das Problem nicht. Die Variante funktioniert aber leider aus anderen Gründen nicht mehr.

Vielen Dank für eure Hilfe

TWART016

Hi,

was ist denn der Unterschied zwischen dem if und dem else? Sieht für mich gleich aus.

Bei DOELSE kommt keine Bedingung, das wäre dann DOELSEIF.

Bei DOIF wird mit einem ? nur geprüft. Außerdem mischt du. Schau dir mal das an:

([badTaster:0_event] eq "S" and [?badDimmer] eq "on") (set badDimmer off)

Ansonsten geh mal in den EventMonitor und erstelle daraus ein DOIF.

SWhof321

Danke TWART16,

habe zuerst mal die Copy-Past Fehler in meiner Frage behoben.

Die Variante mit dem ? funktioniert. :-)

SWhof321

Bzw. ich korrigiere. Die Variante mit dem ? funktioniert so halb... nämlich für das An- und Ausschalten.
Beim zweiten Teil des DOIF, nämlich wo es um die Dimmung geht, habe ich trotz ? den Loop Effekt.
Wenn ich einmal beim Taster den Befehl zum Hoch- oder Runterdimmern gebe, läuft das DOIF so lange bis die obere oder untere Grenze erreicht ist.


{if([badTaster:0_event] eq "S" and [?badDimmer] eq "on") {
   fhem_set "badDimmer off" }
elsif( [badTaster:0_event] eq "S" and [?badDimmer] eq "off") {
   fhem_set "badDimmer on" }
elsif ([badTaster:0_event] eq "SL" and [?badDimmer:pct:d] < 95) {
   $_pct = [badDimmer:pct:d] + 20;
   fhem_set "badDimmer pct $_pct" }
elsif ([badTaster:0_event] eq "LS" and [?badDimmer:pct:d] > 15) {
   $_pct = [badDimmer:pct:d] - 20;
   fhem_set "badDimmer pct $_pct"}
}

rabehd

Zitat von: SWhof321 am 05 August 2020, 08:46:57
Bzw. ich korrigiere. Die Variante mit dem ? funktioniert so halb... nämlich für das An- und Ausschalten.
Beim zweiten Teil des DOIF, nämlich wo es um die Dimmung geht, habe ich trotz ? den Loop Effekt.
Wenn ich einmal beim Taster den Befehl zum Hoch- oder Runterdimmern gebe, läuft das DOIF so lange bis die obere oder untere Grenze erreicht ist.


{if([badTaster:0_event] eq "S" and [?badDimmer] eq "on") {
   fhem_set "badDimmer off" }
elsif( [badTaster:0_event] eq "S" and [?badDimmer] eq "off") {
   fhem_set "badDimmer on" }
elsif ([badTaster:0_event] eq "SL" and [?badDimmer:pct:d] < 95) {
   $_pct = [badDimmer:pct:d] + 20;
   fhem_set "badDimmer pct $_pct" }
elsif ([badTaster:0_event] eq "LS" and [?badDimmer:pct:d] > 15) {
   $_pct = [badDimmer:pct:d] - 20;
   fhem_set "badDimmer pct $_pct"}
}


Das ist KEIN DOIF, sondern eine Mischung aus vielen Dingen.
Auch funktionierende Lösungen kann man hinterfragen.

SWhof321

Hallo rabehd,
Danke für deine Einschätzung, die mir aber so auch nicht weiterhilft.
Da ich ja lernen will, wäre es super, wenn du kurz schreiben könntest, wie du das umsetzten würdest.
Vielen Dank im Vorraus.

rabehd

Ich nehme meinen Einwand zurück.
Du nutzt DOIF wohl im Perl-Modus und hast wohl kein List gemacht.
Auch funktionierende Lösungen kann man hinterfragen.

Damian

Zitat von: SWhof321 am 05 August 2020, 08:46:57
Bzw. ich korrigiere. Die Variante mit dem ? funktioniert so halb... nämlich für das An- und Ausschalten.
Beim zweiten Teil des DOIF, nämlich wo es um die Dimmung geht, habe ich trotz ? den Loop Effekt.
Wenn ich einmal beim Taster den Befehl zum Hoch- oder Runterdimmern gebe, läuft das DOIF so lange bis die obere oder untere Grenze erreicht ist.


{if([badTaster:0_event] eq "S" and [?badDimmer] eq "on") {
   fhem_set "badDimmer off" }
elsif( [badTaster:0_event] eq "S" and [?badDimmer] eq "off") {
   fhem_set "badDimmer on" }
elsif ([badTaster:0_event] eq "SL" and [?badDimmer:pct:d] < 95) {
   $_pct = [badDimmer:pct:d] + 20;
   fhem_set "badDimmer pct $_pct" }
elsif ([badTaster:0_event] eq "LS" and [?badDimmer:pct:d] > 15) {
   $_pct = [badDimmer:pct:d] - 20;
   fhem_set "badDimmer pct $_pct"}
}


Im Perl-Modus gibt es keinen Unterschied zwischen Bedingung und Ausführung - du musst bei allen Angaben zu [badDimmer:pct:d] das Fragezeichen setzen, da sie sonst triggernd wirken.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

SWhof321

Cool, jetzt gehts! Danke Damian.

So sieht es jetzt aus und funktioniert:

{if([badTaster:0_event] eq "S" and [?badDimmer] eq "on") {
   fhem_set "badDimmer off" }
elsif( [badTaster:0_event] eq "S" and [?badDimmer] eq "off") {
   fhem_set "badDimmer on" }
elsif ([badTaster:0_event] eq "SL" and [?badDimmer:pct:d] < 95) {
   $_pct = [?badDimmer:pct:d] + 20;
   fhem_set "badDimmer pct $_pct" }
elsif ([badTaster:0_event] eq "LS" and [?badDimmer:pct:d] > 15) {
   $_pct = [?badDimmer:pct:d] - 20;
   fhem_set "badDimmer pct $_pct"}
}