Hauptmenü

DOIF Beschattung

Begonnen von seule3008, 27 Juni 2018, 16:23:30

Vorheriges Thema - Nächstes Thema

seule3008

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

choetzu

Du müsstest das ganze DOIF posten. So hast du nur den Teil ab DOELSEIF.  Lg C
Raspi3, EnOcean, Zwave, Homematic

Otto123

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
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

seule3008

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

Otto123

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 ))
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

Ellert

#5
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.>"

seule3008

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

seule3008

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.  :-\

Otto123

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")
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

Bartimaus

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....
LG
B.


FHEM@Intel-J4105@Debian-LXC, CUL1101,FS20,IT,DS18B20,DS2413(Heizungslogger),DS2423(Stromlogger)Homematic,HM-LAN,ZWave,MiniCULs,Shelly

Ellert

#10
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.

Frank_Huber

Was ich sehe ist die Klammer Setzung der und / oder Verbindungen nicht eindeutig.

Gesendet von meinem Doogee S60 mit Tapatalk


Ellert

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?

Frank_Huber

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


Otto123

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
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

seule3008

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

Otto123

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
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

Damian

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.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

seule3008

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

seule3008

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

Tobias

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
Maintainer: Text2Speech, TrashCal, MediaList

Meine Projekte: https://github.com/tobiasfaust
* PumpControl v2: allround Bewässerungssteuerung mit ESP und FHEM
* Ein Modbus RS485 zu MQTT Gateway für SolarWechselrichter