Hi zusammen,
ich möchte Helligkeitsbasiert Lichter an- und wieder ausschalten, scheitere aber an der Syntax, die aus einem (vermutlich wilden) Gemisch aus Perl und fhem besteht. Sieht jemand den/die Fehler? Ich knorpel da schon ne Weile dran rum, es will mir nicht aufgehen. Wichtig ist mir, dass ich nur dann Schaltbefehle sende, wenn die entsprechenden Lampen nicht sowieso an- bzw. ausgeschaltet sind.
define TwilightInnenLicht DOIF ([16:00-23:00] and [T:twilight_weather] < 75) ({ \
fhem("set HUEDevice1 dim1% 0;; set HUEDevice1 dim50% 900") if (Value('HUEDevice1') eq "off");; \
fhem("set HUEDevice2 dim1% 0;; set HUEDevice2 dim50% 900") if (Value('HUEDevice2') eq "off");; \
fhem("set ZWAVE_Schalter_2 on") if (Value('ZWAVE_Schalter_2') eq "off")}) \
DOELSEIF ([6:45-09:00] and [T:twilight_weather] < 75) ({\
fhem("set HUEDevice1 dim1% 0;; set HUEDevice1 dim50% 900") if (Value('HUEDevice1') eq "off");; \
fhem("set HUEDevice2 dim1% 0;; set HUEDevice2 dim50% 900") if (Value('HUEDevice2') eq "off") \
}) \
DOELSE ({\
fhem("set HUEDevice1 off") if (Value('HUEDevice1') ne "off");; \
fhem("set HUEDevice2 off") if (Value('HUEDevice2') ne "off");; \
fhem("set ZWAVE_Schalter_2 off") if (Value('ZWAVE_Schalter_2') ne "off")})
Das Logfile meldet immer wieder diesen Fehler:
TwilightInnenLicht: { fhem("set HUEDevice1 off") if (Value('HUEDevice1') ne "off"); fhem("set HUEDevice2 off") if (Value('HUEDevice2') ne "off"); fhem("set ZWAVE_Schalter_2 off") if (Value('ZWAVE_Schalter_2') ne "off")}: Unknown command {, try help.
Unknown command fhem("set, try help.
Unknown command fhem("set, try help.
:-\
du könntest dir vermutlich die wilden Perl-Abfragen sparen, wenn du stattdessen mit Filtern arbeitest (s. http://fhem.de/commandref_DE.html#devspec)
set HUEDevice.*:FILTER=STATE!=off off
Als Beispiel...
Gruß Otto
und um festzustellen ob eine hue lampe an oder aus ist nimm am besten das onoff reading im filter.
gruss
andre
Cooler Tipp - danke - das probiere ich aus. Sieht irgendwie auch deutlich eleganter aus ... ::)
Soweit ich das verstehe, bezieht sich ein Filter auf genau einen Befehl. Wie kann ich aber Befehlsfolgen (ich glaub, man sagt Makros ...?) durch einen Filter eingrenzen wie z.B. diese:
fhem("set HUEDevice1 dim1% 0;; set HUEDevice1 dim50% 900")
Ja - die Tipps sind gut. Du brauchst dann einfach eine Folge von "set" Befehlen mit Komma getrennt. Und jedes mit seinem Filter.
Aber ich grübele noch über Deinen Originalcode. Da sehe ich nämlich keinen Fehler und der müsste auch funktionieren. Die Fehlermeldung deutet darauf hin, dass schon das "{" nicht richtig vom DOIF erkannt wird und als fhem Commando ausgeführt wird. Hast Du da noch irgendwo "versteckten Unfug", so wie Leerzeichen nach den "\" drinnen? Oder mache es dem Parser mal leichter und schreibe "({fhem" gleich hintereinander.
Gruss,
turo
Hi turo,
danke - jetzt fühle ich mich nicht ganz so wie ein Frischling ... ;)
Ich werde aber trotzdem alle Befehle mit Filtern ergänzen. Wenn es keine Möglichkeit gibt, mehrere Befehle mit nur einem Filter abzufrühstücken, dann muss ich die Filter natürlich anpassen, denn nach "set HUEDevice1 dim1% 0" ist die Lampe natürlich nicht mehr aus, sondern an.
VG Yil
Moin Yil,
naja ich finde DOIF ist simpel und einfach mit Zeitspannen, abfrage einzelner Readings usw. Komplexere Sachen werden mit DOIF nicht unbedingt einfacher. DOIF polarisiert hier im Forum auch sehr. :-X
Zwei Ideen: entweder Du gehst konsequent auf Perl und schreibst kleine Routinen in die 99_myUtils - kostet etwas Anfangshürde ist aber dann auch nicht schwierig und irgendwie durchgängig.
Oder für dein Problem setzt Du es auf "FHEM Level" um mit Dummys und notifys.
Also Du fragst dein HUEDevice1 ab, setzt einen Dummy und triggerst mit dem Dummy ein notify was einfach die Befehlsfolge egal wie lang absetzt. Ist ein bissel zergliedert, sieht aber insgesamt logischer aus als dein Konstrukt.
Gruß Otto
Hi Otto,
das sind genau die Gedanken, mit denen ich mich auch schon beschäftigt habe. Einfache DOIF habe ich gefühlt gut im Griff, aber bei komplexeren Statements stoße ich immer wieder an Grenzen, wobei ich als Anfänger gerne von "meinen Grenzen" spreche :o
Und dann versuche ich, mich irgendwie in Perl "rüberzuretten", aber da erwischt es einen Anfänger genauso oft. Hab da noch nicht so richtig meine Linie gefunden, merke aber, dass mir "nur FHEM" irgendwie zu wenig dynamisch ist und nicht immer die Optionen bietet, die ich gerne hätte.
Darf ich mal hierzu nachfragen, wie eine "Perl-Lösung" meines Problems beispielhaft aussehen würde? ::)
VG Yil
Hi Yil,
naja was Du in Deinem DOIF stehen hast ist ja Perl ;) nur eben als Übergabe "durch DOIF hindurch"
Du schreibst eine Routine in die 99_myUtils wie Du die anlegst und Beispiele findest Du im Wiki.
Der Aufruf erfolgt: ({ DeineRoutine('Parameter1','Parameter2','ParameterX');;})
Von mir aus übergibst Du das Device.
Dann schreibst Du den Status des Device in eine Variable, die verändert sich dann nicht mehr und Du setzt die Befehlsfolge ab.
Taste Dich langsam heran, definiere doch vielleicht zuerst nur Deine Befehlsfolge in die myUtils und rufe diese Routine aus deinem DOIF auf. Da brauchst Du nichts zu übergeben.
Gruß Otto
Stimmt - ich probier das so - danke, Otto! :)