Hauptmenü

DOIF und Zähler

Begonnen von rih, 21 Juni 2018, 10:38:03

Vorheriges Thema - Nächstes Thema

rih

Hallo,
ich möchte meine Rolladen unter bestimmten Bedingungen (siehe Code) zur Beschattung teilweise herunter fahren. Das klappt auch zunächst. Nach 12 Sekunden Fahrzeit werden per attr repeatcmd die Kommandos nochmals gesendet, worauf die Rolladen wie gewünscht stoppen.

([10:00-12:30] and [?EZ_Zaehler] < 2 and [Lichtsensor:brightness] > 1500 and [Aussen_Temp:temperature] > 20) (set EZ_Rolladen_L down, set EZ_Rolladen_R down, set EZ_Zaehler {([EZ_Zaehler]+1)}) DOELSEIF ([0:00]) (set EZ_Zaehler 0)

Nun sollte eigentlich der Zähler verhindern, dass die Kommandos ein weiteres mal abgesetzt werden. Tut aber nicht. Der Zähler selbst zählt mit jeder Helligkeits- oder Temperaturänderung lustig hoch.

Was ist da falsch? Wo liegt mein Denkfehler?

Otto123

Hi,
ZitatDie Wiederholung findet so lange statt, bis der Zustand des Moduls in einen anderen DO-Fall wechselt.
Du hast außer Mitternacht keinen anderen DO Fall, den würde ich mit der Abfrage des Zählers erzeugen.

Gruß Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

rih

Hallo Otto,
wie meinst Du das ? Habs jetzt so probiert.

([10:00-12:30] and [Lichtsensor:brightness] > 1500 and [Aussen_Temp:temperature] > 20) (set EZ_Rolladen_L down, set EZ_Rolladen_R down, set EZ_Zaehler {([EZ_Zaehler]+1)}) DOELSE ([0:00] and [?EZ_Zaehler] > 1) (set EZ_Zaehler 0)

Aber das DOIF will trotzdem nicht aus dem cmd1 raus!?

Otto123

Weil es jetzt nicht 00:00 Uhr ist, wenn Du den Zähler auch zwischendurch zurücksetzen willst müsstest Du or (oder) machen.
Außerdem musst Du dann DOELSEIF machen DOELSE hat keine Bedingung. Wie beim ersten Code, dort war es richtig.
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

rabehd

Fährt bei jeder Änderung von Helligkeit und Temperatur der Rollladen 12 sek nach unten?
Hast Du keine Info über die Position?

Ich würde versuchen das schöner zu lösen.
z.B. mit wait statt repeatcmd, dafür müßte man nur die Kommandos in der Zeile wiederholen.

Für Dein Konstrukt wäre auch([10:00-12:30] and [?EZ_Zaehler] < 2 and [Lichtsensor:brightness] > 1500 and [Aussen_Temp:temperature] > 20) (set EZ_Rolladen_L down, set EZ_Rolladen_R down, set EZ_Zaehler {([EZ_Zaehler]+1)}) DOELSEIF ([0:00]) (set EZ_Zaehler 0) DOELSE (ungetestet) eine unschöne Lösung.
DOELSE mit Bedingung geht gar nicht, Du müßtest da einen Fehler im Log haben.
Auch funktionierende Lösungen kann man hinterfragen.

Damian

Zitat von: rih am 21 Juni 2018, 10:38:03
Hallo,
ich möchte meine Rolladen unter bestimmten Bedingungen (siehe Code) zur Beschattung teilweise herunter fahren. Das klappt auch zunächst. Nach 12 Sekunden Fahrzeit werden per attr repeatcmd die Kommandos nochmals gesendet, worauf die Rolladen wie gewünscht stoppen.

([10:00-12:30] and [?EZ_Zaehler] < 2 and [Lichtsensor:brightness] > 1500 and [Aussen_Temp:temperature] > 20) (set EZ_Rolladen_L down, set EZ_Rolladen_R down, set EZ_Zaehler {([EZ_Zaehler]+1)}) DOELSEIF ([0:00]) (set EZ_Zaehler 0)

Nun sollte eigentlich der Zähler verhindern, dass die Kommandos ein weiteres mal abgesetzt werden. Tut aber nicht. Der Zähler selbst zählt mit jeder Helligkeits- oder Temperaturänderung lustig hoch.

Was ist da falsch? Wo liegt mein Denkfehler?

Schlechter Ansatz.

Besser:

([10:00-12:30] and [Lichtsensor:brightness] > 1500 and [Aussen_Temp:temperature] > 20) (set EZ_Rolladen_L down, set EZ_Rolladen_R down) (set EZ_Rolladen_L down, set EZ_Rolladen_R down) DOELSEIF ([00:00])
attr wait 0,12

ohne weitere Attribute.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

rih

Hallo Damian,

ich habe Deinen Vorschlag getestet. Funktioniert so. Vielen Dank.
Was mir noch unklar ist: was bewirkt denn nun das DOELSEIF mit der Bedingung [0:00] um Mitternacht?
Und was war an meinem ursprünglichen Ansatz verkehrt bzw. falsch?

Damian

Zitat von: rih am 21 Juni 2018, 15:10:14
Hallo Damian,

ich habe Deinen Vorschlag getestet. Funktioniert so. Vielen Dank.
Was mir noch unklar ist: was bewirkt denn nun das DOELSEIF mit der Bedingung [0:00] um Mitternacht?
Und was war an meinem ursprünglichen Ansatz verkehrt bzw. falsch?

Du wolltest etwas verwalten, was DOIF vom Ansatz her schon kann. So steht es in der Commandref:

ZitatDas DOIF-Modul arbeitet mit Zuständen. Jeder Ausführungszweig DOIF/DOELSEIF..DOELSEIF/DOELSE stellt einen eigenen Zustand dar (cmd_1, cmd_2, usw.). Das Modul merkt sich den zuletzt ausgeführten Ausführungszweig und wiederholt diesen standardmäßig nicht. Ein Ausführungszweig wird erst dann wieder ausgeführt, wenn zwischenzeitlich ein anderer Ausführungszweig ausgeführt wurde, also ein Statuswechsel des DOIF-Moduls stattgefunden hat. Dieses Verhalten ist sinnvoll, um zu verhindern, dass zyklisch sendende Sensoren (Temperatur, Feuchtigkeit, Helligkeit, usw.) zu ständiger Wiederholung des selben Befehls oder Befehlsabfolge führen.

Um Mitternacht passiert genau das was du wolltest: Zustand ändern, um das Modul für den nächsten Tag scharfzustellen.

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