FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: SWhof321 am 04 August 2020, 22:38:35

Titel: [gelöst] Disko im Bad - DOIF im Loop
Beitrag von: SWhof321 am 04 August 2020, 22:38:35
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
Titel: Antw:Disko im Bad
Beitrag von: TWART016 am 04 August 2020, 23:27:12
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.
Titel: Antw:Disko im Bad
Beitrag von: SWhof321 am 05 August 2020, 08:31:20
Danke TWART16,

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

Die Variante mit dem ? funktioniert. :-)
Titel: Antw:Disko im Bad
Beitrag 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"}
}
Titel: Antw:Disko im Bad
Beitrag von: rabehd am 05 August 2020, 08:58:01
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.
Titel: Antw:Disko im Bad
Beitrag von: SWhof321 am 05 August 2020, 10:29:38
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.
Titel: Antw:Disko im Bad
Beitrag von: rabehd am 05 August 2020, 13:26:13
Ich nehme meinen Einwand zurück.
Du nutzt DOIF wohl im Perl-Modus und hast wohl kein List gemacht.
Titel: Antw:Disko im Bad
Beitrag von: Damian am 05 August 2020, 16:13:42
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.
Titel: Antw:Disko im Bad
Beitrag von: SWhof321 am 06 August 2020, 08:41:16
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"}
}