Hallo
ich habe mir ein Beschattungs DOIF geschrieben und habe ein Problem. Ich habe einen Dummy Beschattung erstellt, um die Funktion ein und aus schalten zu können. Dieses Dummy frage ich im DOIF ab, aber egal ob er auf An oder Aus steht das DOIF fährt immer die Rollladen. Kann mit da jemand evtl einen Tip geben?
DOELSEIF ([Beschattung:state] eq "An" and [Wetter:temperature] > 25 and [Wetter:condition] eq "sonnig" or [Wetter:condition] eq "heiter" or [Wetter:condition] eq "teilweise wolkig" or [Wetter:condition] eq "überwiegend wolkig" and [TC_TWILIGHT:azimuth] > 130 and [TC_TWILIGHT:azimuth] < 250 and [TC_TWILIGHT:elevation] > 30 and [RolloWzFenster:level] ne "20") (set RolloWzFenster pct 20)
Vielen Dank im Voraus
Christian
Du müsstest das ganze DOIF posten. So hast du nur den Teil ab DOELSEIF. Lg C
Hallo Christian,
der Tipp wäre: Mach dir die Funktion von UND (and) und ODER (or) in der logischen Bedeutung klar!
In der Regel musst Du die ganzen or's mit einer Klammer klammern!
irgendwas oder 1 ist immer wahr!
Gruß Otto
Hallo
man seid ihr schnell...
Also hier mal das ganze DOIF
([({twilight("TC_TWILIGHT","sr_civil","06:00","9:00")} - 90 + rand(180))]) (set RolloWzFenster Hoch)
DOELSEIF ([({twilight("TC_TWILIGHT","ss_civil","18:00","22:00")} - 90 + rand(180))]) (set RolloWzFenster Runter)
DOELSEIF ([Beschattung:state] eq "on" and [Wetter:temperature] > 25 and [Wetter:condition] eq "sonnig" or [Wetter:condition] eq "heiter" or [Wetter:condition] eq "teilweise wolkig" or [Wetter:condition] eq "überwiegend wolkig" and [TC_TWILIGHT:azimuth] > 130 and [TC_TWILIGHT:azimuth] < 250 and [TC_TWILIGHT:elevation] > 30 and [RolloWzFenster:level] ne "20") (set RolloWzFenster pct 20)
DOELSEIF ([Beschattung:state] eq "An" and [Wetter:temperature] <= 25 and [TC_TWILIGHT:azimuth] >= 250 and [TC_TWILIGHT:azimuth] < 270 and [RolloWzFenster:level] eq "20") (set RolloWzFenster pct 100)
Als ich die or's in Klammern stehen hatte passierte garnix. Gibt es eine Möglichkeit wie in Exel das ganze schritt für schritt auszuwerten?
Grüße
Christian
Ich mache das immer auf Papier :) mit nullen und einsen
Das "Problem" ist die Reihenfolge in Perl -> http://perldoc.perl.org/perlop.html#Operator-Precedence-and-Associativity
Er macht erst die and und dann die or
Also mach (a and b and (c or d or f ))
Ein Dummy ist meist nicht erforderlich, da ein Reading im DOIF genutzt werden kann. Entweder über uiTable oder klassisch mit readingsList, setList, webCmd und webCmdLabel, z.B. klassisch
define Sonnenschutz DOIF (... [$SELF:Beschattung] eq "An" ...) (<Befehle>)
DOELSEIF ...
...
und die wesentlichen Attribute
attr Sonnenschutz readingList Beschattung
attr Sonnenschutz setList Beschattung:An,Aus
attr Sonnenschutz webCmd Beschattung
attr Sonnenschutz webCmdLabel Beschattungsauswahl
Damit kann man Dummy reduzieren, siehe auch http://fhem.de/commandref_DE.html#DOIF_setList__readingList ff.
Welchen Status hat der Dummy An oder on?
Du kannst Vergleiche abkürzen statt
[Wetter:condition] eq "sonnig" or [Wetter:condition] eq "heiter"
so
[Wetter:condition] =~ "sonnig|heiter|<usw.>"
Hi
wenn ich wahr und unwahr mit 1 und 0 auf nem Blatt prüfe ist ja schon der erste Punkt der Status vom Dummy Beschattung 0 und dann sollte ja weiter schon nichts mehr passieren aber es löst trotzdem aus. das verstehe ich nicht. Ich habe on off und auch An Aus probiert beides die selbe Wirkung.
Als ich das jetzt sortiert und abgekürzt habe bekomme ich jetzt eine Fehlermeldung:
autoRolloWzFenster DOIF: expected DOELSEIF or DOELSE: and ([Wetter:condition] =~ "sonnig|heiter|teilweise wolkig|überwiegend wolkig") (set RolloWzFenster pct 20) DOELSEIF ([Beschattung:state] eq "An" and [Wetter:temperature] <= 25 and [TC_TWILIGHT:azimuth] >= 250 and [TC_TWILIGHT:azimuth] < 270 and [RolloWzFenster:level] eq "20") (set RolloWzFenster pct 100)
([({twilight("TC_TWILIGHT","sr_civil","06:00","9:00")} - 90 + rand(180))]) (set RolloWzFenster Hoch)
DOELSEIF ([({twilight("TC_TWILIGHT","ss_civil","18:00","22:00")} - 90 + rand(180))]) (set RolloWzFenster Runter)
DOELSEIF ([Beschattung:state] eq "on" and [Wetter:temperature] > 25 and [TC_TWILIGHT:azimuth] > 130 and [TC_TWILIGHT:azimuth] < 250 and [TC_TWILIGHT:elevation] > 30 and [RolloWzFenster:level] ne "20") and ([Wetter:condition] =~ "sonnig|heiter|teilweise wolkig|überwiegend wolkig") (set RolloWzFenster pct 20)
DOELSEIF ([Beschattung:state] eq "An" and [Wetter:temperature] <= 25 and [TC_TWILIGHT:azimuth] >= 250 and [TC_TWILIGHT:azimuth] < 270 and [RolloWzFenster:level] eq "20") (set RolloWzFenster pct 100)
Ich verstehe das nicht es läuft ja in der Ursprungsversion aber halt nur das An und Aus nicht, weil er den Status des Dummy ignoriert.
Grüße
Christian
Aso der Dummy ist angelegt damit ich die sache mit dem Schalter aus dem Homekit heraus an und aus schalten kann. Falls das der Sache dient. :-\
Jetzt hast Du die ganzen oder ja in ein and gepackt.
Aber im ersten DOELSIF fehlt die schließende Klammer! Oder die nach and ist zuviel :)
and ([Wetter:condition] =~ "sonnig|heiter|teilweise wolkig|überwiegend wolkig")
Erscheint der State des Dummy auch in den Readings des DOIF ?
Wenn nicht, Dummy einmal an/ausschalten.
DOIF ist EVENT-basiert wie ich lernen musste....
Zitat von: seule3008 am 27 Juni 2018, 18:24:32
Aso der Dummy ist angelegt damit ich die sache mit dem Schalter aus dem Homekit heraus an und aus schalten kann. Falls das der Sache dient. :-\
Ja, wenn Homekit nur Dummys bedienen kann, dann kannst Du natürlich keine Definition einsparen, zu dumm ;)
Zeig uns doch mal das falsche Verhalten im Eventmonitor und dazu passend ein Listing der beteiligten Geräte (Dummy, DOIF, usw.) dann müssen wir nicht soviel raten.
Oder Du versuchst mal hier mit https://wiki.fhem.de/wiki/DOIF/Tools_und_Fehlersuche etwas zu finden.
Was ich sehe ist die Klammer Setzung der und / oder Verbindungen nicht eindeutig.
Gesendet von meinem Doogee S60 mit Tapatalk
Zitat von: Frank_Huber am 27 Juni 2018, 19:44:52
Was ich sehe ist die Klammer Setzung der und / oder Verbindungen nicht eindeutig.
Gesendet von meinem Doogee S60 mit Tapatalk
Ist doch kein oder mehr drin, oder?
Zitat von: Ellert am 27 Juni 2018, 19:47:14
Ist doch kein oder mehr drin, oder?
Ja eben drum.
Gesendet von meinem Doogee S60 mit Tapatalk
In dem Zweig stimmt die Anzahl der Klammern einfach nicht!
([Beschattung:state] eq "on" and [Wetter:temperature] > 25 and [TC_TWILIGHT:azimuth] > 130 and [TC_TWILIGHT:azimuth] < 250 and [TC_TWILIGHT:elevation] > 30 and [RolloWzFenster:level] ne "20") and ([Wetter:condition] =~ "sonnig|heiter|teilweise wolkig|überwiegend wolkig")
Das kann nicht gehen, egal ob der Dummy hüpft! :o ;D ;D ;D
Jetzt verstehe ich nur noch Bahnhof. :o
Habe jetzt die Klammern mal gesetzt wie Otto123 geschrieben hat aber der Fehler ist noch da, wenn ich die so setze ist er weg.
([({twilight("TC_TWILIGHT","sr_civil","06:00","9:00")} - 90 + rand(180))]) (set RolloWzFenster Hoch)
DOELSEIF ([({twilight("TC_TWILIGHT","ss_civil","18:00","22:00")} - 90 + rand(180))]) (set RolloWzFenster Runter)
DOELSEIF ([Beschattung:state] eq "on" and [Wetter:temperature] > 25 and [TC_TWILIGHT:azimuth] > 130 and [TC_TWILIGHT:azimuth] < 250 and [TC_TWILIGHT:elevation] > 30 and [RolloWzFenster:level] ne "20" and ([Wetter:condition] =~ "sonnig|heiter|teilweise wolkig|überwiegend wolkig")) (set RolloWzFenster pct 20)
DOELSEIF ([Beschattung:state] eq "on" and [Wetter:temperature] <= 25 and [TC_TWILIGHT:azimuth] >= 250 and [TC_TWILIGHT:azimuth] < 270 and [RolloWzFenster:level] eq "20") (set RolloWzFenster pct 100)
Aber wie ist das gemeint das die ganzen oder in ein and gepackt sind??? Ich mochte ja nur, dass er das ausführt, wenn eine dieser Wetterbedingungen vorliegt sonst nicht. Und eben auch nur, wenn der Dummy auf on steht sonst auch keine Aktion.
Ich habe leider von Programmiersprache leine Ahnung und blicke nicht mehr durch. Für mein Laienwissen erscheint das logisch was da steht aber für Fhem scheinbar nicht ::)
Ich habe leider keine Log für die DOIFs ich hab mich da mal dran versucht der irgendwie hat das Logfile nie was aufgezeichnet. Und da die anderen Doifs funktionieren habe ich es dann mit den Logs gelassen.
Grüße und gute Nacht
Christian
Dein Code ist ja jedesmal anders ;)
Du hast dein ursprüngliches or Konstrukt
[Wetter:condition] eq "sonnig" or [Wetter:condition] eq "heiter" or [Wetter:condition] eq "teilweise wolkig" or [Wetter:condition] eq "überwiegend wolkig"
in einen Ausdruck gepackt.
[Wetter:condition] =~ "sonnig|heiter|teilweise wolkig|überwiegend wolkig"
Damit hast Du nur noch Bedingungen mit and verknüpft. Sorry, wenn ich das etwas flapsig ausgedrückt habe.
Damit brauchst Du nicht mehr extra klammern.
Ich habe kein Beispiel geschrieben was die Klammenr richtig setzt. Ich habe Dir Deine Fehler gezeigt!
Funktioniert es jetzt? Du hast eine Klammer zuviel aber die stört nicht.
Gruß Otto
Ob eine Klammer zu viel oder zu wenig drin ist, erkennt normalerweise der DOIF-Parser, wenn man nicht die cfg-Datei editiert. Bei Definitionen am besten immer die Ausgabe von list des Moduls hier anhängen, denn damit kann man nicht nur die Definition, sondern auch das was DOIF "verstanden" hat sehen.
Ok ich bin heute im 24 Stunden Dienst und werde morgen mal versuchel so ein List zu erstellen. Danke schonmal für eure Mühen.
Grüße
Hi
danke für eure Hilfe. Ich habe jetzt die Reihenfolge geändert, die Klammern die zuviel waren entfernt und jetzt geht es.
das ist die Zeile die jetzt funktioniert:
DOELSEIF ([Beschattung:state] eq "on" and [Wetter:temperature] >= 22 and [TC_TWILIGHT:azimuth] > 130 and [TC_TWILIGHT:azimuth] < 240 and [TC_TWILIGHT:elevation] > 30 and [RolloWzFenster:level] ne "20" and [Wetter:condition] =~ "sonnig|heiter|teilweise wolkig|überwiegend wolkig") (set RolloWzFenster pct 20)
Danke und Grüße
Christian
kleiner HInweis: Statt der Wetter condition würde ich stattdessen lieber auf die Globalstrahlung (Proplanta Modul) zurückgreifen. Mit einem Wert > 5.5 liegst du dann ganz gut. So habe ich es