FHEM > Anfängerfragen

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

(1/2) > >>

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.

--- Code: ---{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"}
}

--- Ende Code ---
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:


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

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.


--- Code: ---
{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"}
}
--- Ende Code ---

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.


--- Code: ---
{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"}
}
--- Ende Code ---

--- Ende Zitat ---

Das ist KEIN DOIF, sondern eine Mischung aus vielen Dingen.

Navigation

[0] Themen-Index

[#] Nächste Seite

Zur normalen Ansicht wechseln