(ERLEDIGT) DOIF kommt nicht über CMD1 oder CMD3 hinaus...

Begonnen von misux, 02 Juni 2018, 22:10:44

Vorheriges Thema - Nächstes Thema

misux

HI! Irgendwie habe ich mir mein DOIF zerschossen finde aber den Fehler nicht...

Wenn TVTime on oder off geht  Schafft mein DOIF nur den CMD_1 oder den CMD_3... mehr interessiert ihn nicht... Wo liegt mein Fehler? Könnte mir jemand auf die sprünge helfen?


([LichtSensor:brightness] < 6.5 and [?TVTime:state] eq "off" and [?15:00-22:15]) (set WZBodenLed on)
DOELSEIF
([LichtSensor:brightness] < 5.5 and [?TVTime:state] eq "off" and [?15:00-22:15]) (set WZEZ_WZFLed on)
DOELSEIF
([?LichtSensor:brightness] < 6.5 and [TVTime:state] eq "off" and [?15:00-22:15]) (set WZBodenLed on)
DOELSEIF
([?LichtSensor:brightness] < 5.5 and [TVTime:state] eq "off" and [?15:00-22:15]) (set WZEZ_WZFLed on)
DOELSEIF
([TVTime:state] eq "off" and [22:15-05:00] and [?PartyTime:state] eq "off") (set WZEZ_WZFLed on-for-timer 600) (set WZBodenLed on-for-timer 900)
DOELSEIF
([TVTime:state] eq "off" and [?22:15-05:00] and [PartyTime:state] eq "on") (set WZBodenLed on) (set WZEZ_WZFLed on)
DOELSEIF
([?TVTime:state] eq "off" and [?22:15-08:00] and [PartyTime:state] eq "off") (set WZBodenLed off) (set WZEZ_WZFLed off)
DOELSEIF
([TVTime:"on"] and [?WZBodenLed:"on"]) (set WZBodenLed off)
DOELSEIF
([TVTime:"on"] and [?WZEZ_WZFLed:"on"]) (set WZEZ_WZFLed off)
DOELSEIF
([LichtSensor:brightness] > 6.5) (set WZBodenLed off)
DOELSEIF
([LichtSensor:brightness] > 5.5) (set WZEZ_WZFLed off)

Damian

Das hat etwas mit Logik zu tun: eine Zahl die kleiner als 5,5 ist, ist immer auch kleiner als 6,5 ;)
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

misux

 :o

OKay, verstehe, aber wie gebe ich dem DOIF zu verstehen das er bei diesen Werten schalten soll aber AUCH wenn diese dadrunter sind und auf einmal TVTime on oder off geschaltet wird...

Damian

#3
Zitat von: misux am 02 Juni 2018, 22:21:51
:o

OKay, verstehe, aber wie gebe ich dem DOIF zu verstehen das er bei diesen Werten schalten soll aber AUCH wenn diese dadrunter sind und auf einmal TVTime on oder off geschaltet wird...

Bei kleiner zuerst kleine Zahlen abfragen, bei größer mit großen anfangen - das gilt für alle Programmiersprachen.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

misux

Hmm... habe es versucht anzupassen... jetzt hängt er komplett beim CDM_1 egal ob ich TVTime on oder off schalte...


([?LichtSensor:brightness] < 5.5 and [TVTime:state] eq "off" and [?15:00-22:45]) (set WZEZ_WZFLed on)
DOELSEIF
([LichtSensor:brightness] < 5.5 and [?TVTime:state] eq "off" and [?15:00-22:45]) (set WZEZ_WZFLed on)
DOELSEIF
([?LichtSensor:brightness] < 6.5 and [TVTime:state] eq "off" and [?15:00-22:45]) (set WZBodenLed on)
DOELSEIF
([LichtSensor:brightness] < 6.5 and [?TVTime:state] eq "off" and [?15:00-22:45]) (set WZBodenLed on)
DOELSEIF
([TVTime:state] eq "off" and [22:45-05:00] and [?PartyTime:state] eq "off") (set WZEZ_WZFLed on-for-timer 600) (set WZBodenLed on-for-timer 900)
DOELSEIF
([TVTime:state] eq "off" and [?22:45-05:00] and [PartyTime:state] eq "on") (set WZBodenLed on) (set WZEZ_WZFLed on)
DOELSEIF
([?TVTime:state] eq "off" and [?22:45-08:00] and [PartyTime:state] eq "off") (set WZBodenLed off) (set WZEZ_WZFLed off)
DOELSEIF
([LichtSensor:brightness] > 6.5) (set WZBodenLed off)
DOELSEIF
([LichtSensor:brightness] > 5.5) (set WZEZ_WZFLed off)

misux

#5
Habe es jetzt mal komplett neu gemacht weil irgendwie nix mehr funktioniert hat...

Habe aber immernoch das Problem das bei TVTime "on" bleibt er jedesmal bei cmd:1 hängen und cmd_3 ignoriert er... egal ob ich kleiner zuerst setze oder größer...

([TVTime:state] eq "on" and [?LichtSensor:brightness] < 5.5) (set WZEZ_WZFLed off)
DOELSEIF
([?TVTime:state] eq "on" and [LichtSensor:brightness] < 5.5) (set WZEZ_WZFLed off)
DOELSEIF
([TVTime:state] eq "on" and [?LichtSensor:brightness] < 6.5) (set WZBodenLed off)
DOELSEIF
([?TVTime:state] eq "on" and [LichtSensor:brightness] < 6.5) (set WZBodenLed off)
DOELSEIF
([TVTime:state] eq "off" and [?PartyTime:state] eq "off") (set WZEZ_WZFLed on-for-timer 600) (set WZBodenLed on-for-timer 900)
DOELSEIF
([TVTime:state] eq "off" and [PartyTime:state] eq "on") (set WZBodenLed on) (set WZEZ_WZFLed on)
DOELSEIF
([?TVTime:state] eq "off" and [PartyTime:state] eq "off") (set WZBodenLed off) (set WZEZ_WZFLed off)

choetzu

Hmm, ich versteh nicht ganz wieso du einmal bei cmd1 auf on triggerst und dann bei cmd2 auf < 5.5.. evtl gehts ja so..


([TVTime:state] eq "on" and [LichtSensor:brightness] < 5.5 and [?WZEZ_WZFLed] eq "on") (set WZEZ_WZFLed off
DOELSEIF
([TVTime:state] eq "on" and [LichtSensor:brightness] < 6.5 and [?WZBodenLed] eq "on") (set WZBodenLed off)
..........

Natürlich darf kein do always gesetzt sein..
Raspi3, EnOcean, Zwave, Homematic

misux

Zitat von: choetzu am 03 Juni 2018, 09:09:33
Hmm, ich versteh nicht ganz wieso du einmal bei cmd1 auf on triggerst und dann bei cmd2 auf < 5.5..

Hmmm.... Jetzt wo du es sagst... Weiß ich das auch nicht so genau....  ::)

Werde dein Beispiel mal antesten...

Danke!

misux

#8
das ist eigenartig... das funktioniert auch nicht... Habe jetzt mal was genz einfaches getestet... leider ignoriert er die zweite TVTime ON sequenz auch... er bleibt beim ertsen cmd stehen...
Da stimmt doch was nicht... ???


([TVTime:state] eq "on" and [Tageslicht_indoorSensor] eq "Nacht" and [?14:00-22:15]) (set WZEZ_WZFLed off)
DOELSEIF
([TVTime:state] eq "off" and [Tageslicht_indoorSensor] eq "Nacht" and [?14:00-22:15]) (set WZEZ_WZFLed on)
DOELSEIF
([TVTime:state] eq "on" and [Tageslicht_indoorSensor] eq "Nacht" and [?14:00-22:15]) (set WZBodenLed off)
DOELSEIF
([TVTime:state] eq "off" and [Tageslicht_indoorSensor] eq "Nacht" and [?14:00-22:15]) (set WZBodenLed on)

rischbiter123

Ich bin mir nicht ganz sicher, aber arbeitet DOIF nicht so, dass es bei einer Triggerung die einzelnen Zweige nacheinander abarbeitet, bis es eine Übereinstimmung findet und dann den entsprechenden Befehl ausführt? Und dort dann praktisch bis zur nächsten Änderung wartet? Wenn ja, dann müssten doch die Befehle, die bei gleicher Bedingung ausgeführt werden sollen, auch in einem Zweig stehen.
4*Raspi, Max Thermostate und Fensterkontakte, FB7590, Mysensors und NanoCUL, IT und Sonoff, zigbee2mqtt2

choetzu

Dein ist erneut anders :)

Rischbiter123 hat recht. Zudem macht cmd3 nicht Sinn, weil es genau die selbe Bedingung hat wie cmd3. So sollte es eigentlich gehen, oder?


([TVTime:state] eq "on" and [Tageslicht_indoorSensor] eq "Nacht" and [?14:00-22:15])
(set WZEZ_WZFLed off)
(set WZBodenLed off)
DOELSEIF
([TVTime:state] eq "off" and [Tageslicht_indoorSensor] eq "Nacht" and [?14:00-22:15])
(set WZEZ_WZFLed on)
(set WZBodenLed on)
Raspi3, EnOcean, Zwave, Homematic

misux

Ich hatte ja im POST #5 ja das gleiche Problem obwohl die Bedingungen unterschiedlich waren, deshalb habe ich die komplett abgespeckte Variante versucht um nachvollziehen zu können wo das Problem
liegt...

Werde heute Abend mal folgendes probieren und schauen ob das funktioniert...


([LichtSensor:brightness] < 5.5 and [TVTime:state] eq "off" and [?15:00-22:15]) (set WZBodenLed on)
DOELSEIF
([LichtSensor:brightness] < 6.5 and [TVTime:state] eq "off" and [?15:00-22:15]) (set WZEZ_WZFLed on)
DOELSEIF
([TVTime:state] eq "off" and [22:15-05:00] and [?PartyTime:state] eq "off") (set WZEZ_WZFLed on-for-timer 600) (set WZBodenLed on-for-timer 900)
DOELSEIF
([TVTime:state] eq "off" and [?22:15-05:00] and [PartyTime:state] eq "on") (set WZBodenLed on) (set WZEZ_WZFLed on)
DOELSEIF
([?TVTime:state] eq "off" and [?22:15-08:00] and [PartyTime:state] eq "off") (set WZBodenLed off) (set WZEZ_WZFLed off)
DOELSEIF
([TVTime:"on"] and [?WZBodenLed:"on"]) (set WZBodenLed off)
DOELSEIF
([TVTime:"on"] and [?WZEZ_WZFLed:"on"]) (set WZEZ_WZFLed off)
DOELSEIF
([LichtSensor:brightness] > 6.5) (set WZBodenLed off)
DOELSEIF
([LichtSensor:brightness] > 5.5) (set WZEZ_WZFLed off)

Damian

Ohne mich mit der Logik der Abfragen auseinandersetzen zu wollen, diese Syntax:

Zitat[?WZBodenLed:"on"]

macht wenig Sinn.

Ohne Fragezeichen
Zitat[WZBodenLed:"on"]
ist diese Ereignisabfrage im Augenblick des Events true und sonst ist sie immer false. Mit Fragezeichen verhinderst du den Trigger des Events. Somit ist
Zitat[?WZBodenLed:"on"]
niemals wahr.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

misux

#13
Aber stellt das Fragezeichen nicht eine reine Abfrage des Zustands dar ohne zu Triggern wenn sich der Status ändert??

Oder muss das dann so klingen:

[?WZBodenLed:state] eq "on"

Also zum Verständnis:

Zitat[?WZBodenLed:"on"]
alles Mist?

Zitat[WZBodenLed:"on"]
Abfrage und Triggerung auf den Zustand?

Zitat[WZBodenLed:state] eq "on"
Abfrage und Triggerung auf den Zustand?

Zitat[WZBodenLed] eq "on"
Abfrage und Triggerung auf den Zustand?

Ist das so korrekt?



Damian

Zitat von: misux am 04 Juni 2018, 12:32:43
Aber stellt das Fragezeichen nicht eine reine Abfrage des Zustands dar ohne zu Triggern wenn sich der Status ändert??

Oder muss das dann so klingen:

[?WZBodenLed:state] eq "on"

Also zum Verständnis:

[?WZBodenLed:"on"] reine Abfrage des Zustandes?

[WZBodenLed:"on"] Abfrage und Triggerung auf den Zustand

[?WZBodenLed:"on"] alles Mist

[WZBodenLed:"on"] Abfrage und Triggerung auf den Zustand


Ist das so korrekt?

Nein, sobald Anführungszeichen vorkommen, fragst du Events ab.

Abfrage eines Zustandes bedeutet Abfrage eines Status z. B. [WZBodenLed] oder Abfrage eines Readings z. B. [WZBodenLed:state], denn nur diese können einen bestimmten Wert (Zustand) beinhalten/speichern. Nur nur dort macht das Fragezeichen am Anfang einen Sinn.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

misux

aha... so langsam kommt licht ins Dunkel.... tue mir noch schwer mit mit dem Event oder Reading

Was macht denn mehr sinn? Auf Event oder auf das Reading Triggern?

misux

Oh mann... da setzt man "unbewusst" irgendwo ein event-on-change .*:300 attr und schon läuft alles schief...

Ich entschuldige mich für blöde Fragen aber ich wusste ehrlich gesagt nicht warum das eine oder andere nicht mehr funktioniert...

Ich habe das event-on-change attr beim LichtSensor gesetzt und all meine DOIFS umgebastelt sodass sie den Lichtsensor betrachten und nicht meinen TAG/Nacht Dummy... Durch das reading hat aber der Lichtsensor nicht richtig funktioniert und auch meine DOIFS nicht. Bis ich das erstmal herausgefunden habe... ::) War ein Tipp vom Foren User ;)

Naja, das Reading ist gelöscht, wieder viel gelernt durch euch, meine DOIFS etwas gepimpt und nun rennt es wieder!

Vielen Dank für eure Hilfsbereitschaft und vor allem Geduld!

Hier mein soweit funktionierender code... Hoffe er funktioniert nicht weil ich Glück habe sondern weil ich diesmal auch alles richtig gemacht habe...

([TVTime:state] eq "on" and [?08:00-22:15]) (set WZEZ_WZFLed off) (set WZBodenLed off)
DOELSEIF
([TVTime:state] eq "off" and [?08:00-22:15]) (set WZEZ_WZFLed on) (set WZBodenLed on)
DOELSEIF
([?TVTime:state] eq "off" and [LichtSensor:brightness] < 25.0 and [?08:00-22:15] and [?WZEZ_WZFLed] eq "off" and [?WZBodenLed] eq "off") (set WZBodenLed on) (set WZEZ_WZFLed on)
DOELSEIF
([TVTime:state] eq "off" and [22:15-08:00] and [?PartyTime:state] eq "off" and [?LichtSensor:brightness] < 20.0) (set WZEZ_WZFLed on-for-timer 600) (set WZBodenLed on-for-timer 900)
DOELSEIF
([TVTime:state] eq "off" and [PartyTime:state] eq "on" and [?LichtSensor:brightness] < 20.0) (set WZBodenLed on) (set WZEZ_WZFLed on)
DOELSEIF
([?TVTime:state] eq "off" and [PartyTime:state] eq "off" and ([?WZEZ_WZFLed] eq "on" or [?WZBodenLed] eq "on")) (set WZEZ_WZFLed off) (set WZBodenLed off)

Per

Zitat von: misux am 04 Juni 2018, 13:55:29Was macht denn mehr sinn? Auf Event oder auf das Reading Triggern?
Um mit den Worten eines Klassikers zu antworten
Zitat von: KlassikerEs kommt darauf an
Nämlich auf das, was du erreichen willst. Alle drei Varianten (Event, triggernder Status und nichttriggernder Status) haben ihre Berechtigung, sonst hätte Damian das auch nicht eingeführt.

In deinem Fall wären die drei Kombinationen
Umgebung + Zeit
["EVENT"] + [triggernder Status]
["EVENT"] + [?nichttriggernder Status]
[triggernder Status] + [?nichttriggernder Status]
richtig, wobei die erste mehr Prozessorzeit (ohne GGleistung!) beansprucht.

Zitat von: misux am 04 Juni 2018, 21:44:41Hoffe er funktioniert nicht weil ich Glück habe sondern weil ich diesmal auch alles richtig gemacht habe...
Den Zahn muss ich dir ziehen. Leider.

DOELSEIF
([TVTime:state] eq "off" and [?08:00-22:15]) (set WZEZ_WZFLed on) (set WZBodenLed on)
DOELSEIF
([?TVTime:state] eq "off" and [LichtSensor:brightness] < 25.0 and [?08:00-22:15] and [?WZEZ_WZFLed] eq "off" and [?WZBodenLed] eq "off") (set WZBodenLed on) (set WZEZ_WZFLed on)

Der (hier) zweite Fall wird nie eintreten, weil egal wie LichtSensor:brightness ist, es schon vorher abgefangen wird. Da muss du die Reihenfolge umdrehen.

Nochwas: wenn du es nicht für irgendwelche Attribute brauchst, kannst du aus
(set WZEZ_WZFLed on) (set WZBodenLed on)
(set WZEZ_WZFLed on,set WZBodenLed on)
oder gar
(set WZEZ_WZFLed,WZBodenLed on)
schreiben, senkt die Prozessorlast nochmal (wenn auch wenig, aber auch Kleinvieh...

misux

#18
HI!

Habe es jetzt umgestellt und so erfolgreich getestet!  ;D


([TVTime:state] eq "on" and [?08:00-22:15]) (set WZEZ_WZFLed off,set WZBodenLed off)
DOELSEIF
([TVTime:state] eq "off" and [?08:00-22:15] and [?LichtSensor:brightness] < 25.0) (set WZEZ_WZFLed on,set WZBodenLed on)
DOELSEIF
([LichtSensor:brightness] < 25.0 and [?TVTime:state] eq "off" and [?08:00-22:15]) (set WZBodenLed on,set WZEZ_WZFLed on)
DOELSEIF
([LichtSensor:brightness] > 25.0 and [?TVTime:state] eq "off" and [?08:00-22:15]) (set WZBodenLed off) (set WZEZ_WZFLed off)
DOELSEIF
([TVTime:state] eq "off" and [22:15-08:00] and [?PartyTime:state] eq "off" and [?LichtSensor:brightness] < 25.0) (set WZEZ_WZFLed on-for-timer 600) (set WZBodenLed on-for-timer 900)
DOELSEIF
([TVTime:state] eq "off" and [PartyTime:state] eq "on" and [?LichtSensor:brightness] < 25.0) (set WZBodenLed on,set WZEZ_WZFLed on)
DOELSEIF
([?TVTime:state] eq "off" and [PartyTime:state] eq "off" and ([?WZEZ_WZFLed] eq "on" or [?WZBodenLed] eq "on")) (set WZEZ_WZFLed off) (set WZBodenLed off)


Aber ich muss es mindestens so: (set WZBodenLed on,set WZEZ_WZFLed on) schreiben... bei (set WZBodenLed,WZEZ_WZFLed on) schmeißt er mir einen Error raus:

Zitat
2018.06.05 18:50:58.533 2: DOIFWzEzBeleuchtung: set WZEZ_WZFLed: no set argument specified
2018.06.05 18:50:58.538 2: DOIFWzEzBeleuchtung: WZBodenLed off: Unknown command WZBodenLed, try help.

Allerdings habe ich nun mal wieder ein anderes "Problem"

Ich bekomme ständig einen LOGEintrag, ca alle 30 sek.
Dieseer kommt von den Zeilen,

([LichtSensor:brightness] < 25.0 and [?TVTime:state] eq "off" and [?08:00-22:15]) (set WZBodenLed on,set WZEZ_WZFLed on)
DOELSEIF
([LichtSensor:brightness] > 25.0 and [?TVTime:state] eq "off" and [?08:00-22:15]) (set WZBodenLed off) (set WZEZ_WZFLed off)

weil sich ja der Lichtwert ständig ändert... (doalways ist nicht gesetzt)

mit:


([LichtSensor:brightness] < 25.0 and [?TVTime:state] eq "off" and [?08:00-22:15] and [WZBodenLed:status] eq "off" and [WZEZ_WZFLed:status] eq "off") (set WZBodenLed on,set WZEZ_WZFLed on)
DOELSEIF
([LichtSensor:brightness] > 25.0 and [?TVTime:state] eq "off" and [?08:00-22:15]  and [WZBodenLed:status] eq "on" and [WZEZ_WZFLed:status] eq "on") (set WZBodenLed off) (set WZEZ_WZFLed off)


Habe ich es schon versucht, aber ich habe noch teils laufende verzögerungs Timer die auf die beiden (WZBodenLed) (WZEZ_WZFLed) gesetzt werden und dann kann es passieren das einer der beiden doch noch "on" ist und schon funktioniert es nicht.

Wie könnte ich diese Log Einträge noch verhindern?