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
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.
Danke TWART16,
habe zuerst mal die Copy-Past Fehler in meiner Frage behoben.
Die Variante mit dem ? funktioniert. :-)
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"}
}
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.
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.
Ich nehme meinen Einwand zurück.
Du nutzt DOIF wohl im Perl-Modus und hast wohl kein List gemacht.
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.
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"}
}