Hauptmenü

neues Modul DOIF

Begonnen von Damian, 21 Mai 2014, 15:53:18

Vorheriges Thema - Nächstes Thema

Damian

Zitat von: satprofi am 30 November 2014, 18:59:17
Hallo.
Nach heutigem update und anschliesenden shutwdown/restart kam folgende meldung

Dunkelheit_off DOIF: the at function "ReadingsVal("myTwilight","sr_indoor","")" must return a timespec and not <empty string>.: {ReadingsVal("myTwilight","sr_indoor","")}\





define Dunkelheit_off DOIF ([{ReadingsVal("myTwilight","sr_indoor","")}]) (set Dunkelheit off)


was wurde jetzt bei doif geändert?

Die Frage müsste lauten, was hat sich bei dir geändert? Die Meldung ist eindeutig und sagt, dass dein Reading "" liefert. Offenbar ist es einfach zum diesem Zeitpunkt nicht existent gewesen und dann wird dein voreingestellter Default-Wert hier "" genommen.

Gruß

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

knochenmuehle

Fehlermeldung: di_TueraufPumpean: perl error in condition: (InternalDoIf('Zirkulationspumpe','STATE','') eq "off" and InternalDoIf('MK_Haustuer','STATE','') eq "open") (set Zirkulationspumpe on): syntax error at (eval 46) line 1, near ") ("

DEF: (([Zirkulationspumpe] eq "off" and [MK_Haustuer] eq "open") (set Zirkulationspumpe on))

ich seh den Wald vor lauter Bäumen nicht ...

maxritti

Zitat von: knochenmuehle am 01 Dezember 2014, 11:42:39
Fehlermeldung: di_TueraufPumpean: perl error in condition: (InternalDoIf('Zirkulationspumpe','STATE','') eq "off" and InternalDoIf('MK_Haustuer','STATE','') eq "open") (set Zirkulationspumpe on): syntax error at (eval 46) line 1, near ") ("

DEF: (([Zirkulationspumpe] eq "off" and [MK_Haustuer] eq "open") (set Zirkulationspumpe on))

ich seh den Wald vor lauter Bäumen nicht ...

Mach mal die Äußeren runden Klammern weg

([Zirkulationspumpe] eq "off" and [MK_Haustuer] eq "open") (set Zirkulationspumpe on)

oder so das logische und klammern

(([Zirkulationspumpe] eq "off") and ([MK_Haustuer] eq "open")) (set Zirkulationspumpe on)

moonsorrox

da ich immer noch am probieren bin und kein Ergebnis ohne Fehler hin bekomme, hier mal mein letzter Stand.
Als Fehler ist ein Syntax error vorhanden, vllt ist es ja nur noch eine Kleinigkeit, aber meine ganzen Versuche scheiterten bisher

Fehler:
perl error in condition: InternalDoIf('Zeitsteuerung','STATE','') eq "Zufall" and RandomTimer * (DOIF_time_once($hash->{timer}{0},$wday,"0123456")) WegLampe_Sw_02 * {sunset_abs (3 * 3600) } 480 : syntax error at (eval 1326470) line 1, near ") WegLampe_Sw_02 "

DEF:
( [Zeitsteuerung] eq "Zufall" and RandomTimer * ([{sunset_abs("CIVIL",-8100,"14:00","22:20")}|0123456]) WegLampe_Sw_02 * {sunset_abs (3 * 3600) } 480 )

Der hintere Teil des codes ist exakt aus der commandref vom RT genommen (device ersetzt durch meines) damit dachte ich habe ich ein Erfolg :-\
Ich wollte jetzt nicht noch einen Beitrag in RandomTimer eröffnen, deshalb hier nochmal, da der Fehler ja im DOIF erscheint.
Intel-NUC i5: FHEM-Server 6.1 :: Perl v5.18.2

Homematic: HM-USB-CFG2,HM-CFG-LAN Adapter, HM-LC-BL1-FM, HM-LC-Sw1PBU-FM, HM-LC-Sw1-PI-2, HM-WDS10-TH-O, HM-CC-TC, HM-LC-SW2-FM

maxritti

Auch das sieht für mich wieder nicht stimmig aus.

Laut CommandRef müsste die DEF des DOIFs in diesem Format enden.

(<Bedingung>) (<Befehle>) DOELSEIF (<Bedingung>) (<Befehle>) DOELSEIF ... DOELSE (<Befehle>)

Deine sehen so aus, dass diese ganz aussen ein Klammerpaar (...) haben.
Und damit ist es in der Tat syntaktisch nicht korrekt.

Jens_B

Zitat von: moonsorrox am 01 Dezember 2014, 14:43:26
da ich immer noch am probieren bin und kein Ergebnis ohne Fehler hin bekomme, hier mal mein letzter Stand.
Als Fehler ist ein Syntax error vorhanden, vllt ist es ja nur noch eine Kleinigkeit, aber meine ganzen Versuche scheiterten bisher

Fehler:
perl error in condition: InternalDoIf('Zeitsteuerung','STATE','') eq "Zufall" and RandomTimer * (DOIF_time_once($hash->{timer}{0},$wday,"0123456")) WegLampe_Sw_02 * {sunset_abs (3 * 3600) } 480 : syntax error at (eval 1326470) line 1, near ") WegLampe_Sw_02 "

DEF:
( [Zeitsteuerung] eq "Zufall" and RandomTimer * ([{sunset_abs("CIVIL",-8100,"14:00","22:20")}|0123456]) WegLampe_Sw_02 * {sunset_abs (3 * 3600) } 480 )

Der hintere Teil des codes ist exakt aus der commandref vom RT genommen (device ersetzt durch meines) damit dachte ich habe ich ein Erfolg :-\
Ich wollte jetzt nicht noch einen Beitrag in RandomTimer eröffnen, deshalb hier nochmal, da der Fehler ja im DOIF erscheint.

Ich verstehe gerad nicht, wo hier DOIF und DOELSEIF versteckt ist?

RaspberryPi 4 (Raspian Buster)FHEM+Homebridge
HMLAN für Homematic
Z-Wave USB Stick
Shelly Devices
Fritz!Box 7590Ax

moonsorrox

Zitat von: maxritti am 01 Dezember 2014, 15:09:03
Auch das sieht für mich wieder nicht stimmig aus.

Laut CommandRef müsste die DEF des DOIFs in diesem Format enden.

(<Bedingung>) (<Befehle>) DOELSEIF (<Bedingung>) (<Befehle>) DOELSEIF ... DOELSE (<Befehle>)

ja klar das sagt ja wohl auch der Fehler, aber leider bin ich da nicht so bewandert und benötige Hilfe...
Ich habe mir schon zigmal die commandref und vorallem die Beispiele angeschaut, komme aber zu keinem fehlerfreiem Ergebnis.

Wenn ich es richtig deute was du schreibst sollte der Fehler in dem hinteren Bereich des Code liegen, also ab hier:
WegLampe_Sw_02 * {sunset_abs (3 * 3600) } 480 )
Intel-NUC i5: FHEM-Server 6.1 :: Perl v5.18.2

Homematic: HM-USB-CFG2,HM-CFG-LAN Adapter, HM-LC-BL1-FM, HM-LC-Sw1PBU-FM, HM-LC-Sw1-PI-2, HM-WDS10-TH-O, HM-CC-TC, HM-LC-SW2-FM

maxritti

#802
Also in den letzten (....) steht das, was ausgeführt werden soll, wenn die Bedingung des DOIF erfüllt ist.

Will heissen, gib mal folgenden Code in Dein Webinterface bei fhem ein und drücke Enter.

WegLampe_Sw_02 * {sunset_abs (3 * 3600) } 480 )

Da gehe ich mal von aus, dass auch das in einen Fehler läuft.
Denn mind. die letzte Klammer ) ist zuviel oder vorne fehlt eine.
Wobei ich von dem gesamten Code nicht weiss, was er machen soll, aber das ist eine andere Baustelle :)

Und damit wäre dann alles vor dem WegLampe_Sw_02 die Bedingung des DOIFs.
Also das hier:

( [Zeitsteuerung] eq "Zufall" and RandomTimer * ([{sunset_abs("CIVIL",-8100,"14:00","22:20")}|0123456])

Und da ist die öffnende Klammer am Anfang zuviel oder am Ende fehlt eine.
Auf jeden Fall stimmt die Anzahl der ( nicht mit der Anzahl der ) überein.

Eventuell wird es damit plausibler, wie das syntaktisch auszusehen hat?

knochenmuehle


Merlin1

Zitat von: Reinerlein am 28 November 2014, 16:18:53
dafür kannst du das Attribut "wait" am DOIF einstellen. Damit kannst du die Zeitverzögerung in Sekunden einstellen, die *vor* Ausführung des entsprechenden Kommandos gewartet wird.
Wenn innerhalb der Wartezeit die Bedingung für die Ausführung des Kommandos wieder ungültig wird, wird der Timer abgebrochen (und bei Gültigkeit wieder angestartet).
Tausend Dank! Klappt so.

moonsorrox

#805
Zitat von: maxritti am 01 Dezember 2014, 16:43:12
Will heissen, gib mal folgenden Code in Dein Webinterface bei fhem ein und drücke Enter.

WegLampe_Sw_02 * {sunset_abs (3 * 3600) } 480 )
das habe ich mal gemacht, folgendes kommt dann:
Unknown command WegLampe_Sw_02, try help.

Zitat von: maxritti am 01 Dezember 2014, 16:43:12
Denn mind. die letzte Klammer ) ist zuviel oder vorne fehlt eine.
Wobei ich von dem gesamten Code nicht weiss, was er machen soll, aber das ist eine andere Baustelle :)
wenn ich aber jetzt eine Klammer wegnehme kommt der Fehler wie oben...
und mit Klammer "(" vorn  Unknown command (WegLampe_Sw_02, try help

Zur Erklärung der Code soll, wenn das Dummy Zeitsteuerung auf Zufall steht mit dem RandomTimer arbeiten und eben die Zeit mit dessen Parametern schalten...
Ein define mit dem RandomTimer habe ich separat der funktioniert, aber ich wollte das mit diesem DOIF machen dann brauche ich nicht mehrere Dummys aktivieren
Das selbe Dummy "Zeitsteuerung" macht eben auch noch die normale Schaltung der Beleuchtung täglich, wenn ich zuhause bin.

Zitat von: maxritti am 01 Dezember 2014, 16:43:12
Und damit wäre dann alles vor dem WegLampe_Sw_02 die Bedingung des DOIFs.
Also das hier:

( [Zeitsteuerung] eq "Zufall" and RandomTimer * ([{sunset_abs("CIVIL",-8100,"14:00","22:20")}|0123456])

Und da ist die öffnende Klammer am Anfang zuviel oder am Ende fehlt eine.
Auf jeden Fall stimmt die Anzahl der ( nicht mit der Anzahl der ) überein.
Diese Bedingung läuft schon ohne den RandomTimer, dann steht an Stelle von "Zufall" eben "Dämmerung", so habe ich es genannt, der Code ist weiter oben in dem Beitrag.
Nur ich dachte ich kann es ableiten, aber leider nicht.


Zitat von: maxritti am 01 Dezember 2014, 16:43:12
Eventuell wird es damit plausibler, wie das syntaktisch auszusehen hat?
naja...  :-\ das mit den Klammern erscheint mir schon logisch, aber funktioniert eben nicht, vllt geht das nicht mit dem RandomTimer..?
Intel-NUC i5: FHEM-Server 6.1 :: Perl v5.18.2

Homematic: HM-USB-CFG2,HM-CFG-LAN Adapter, HM-LC-BL1-FM, HM-LC-Sw1PBU-FM, HM-LC-Sw1-PI-2, HM-WDS10-TH-O, HM-CC-TC, HM-LC-SW2-FM

Jens_B

Zitat von: moonsorrox am 02 Dezember 2014, 00:39:14
das habe ich mal gemacht, folgendes kommt dann:
Unknown command WegLampe_Sw_02, try help.
wenn ich aber jetzt eine Klammer wegnehme kommt der Fehler wie oben...
und mit Klammer "(" vorn  Unknown command (WegLampe_Sw_02, try help


Ist doch irgendwie klar, oder? WegLampe_Sw_02 ist dein Device, welches Kommando soll fhem an dem Device ausführen, das fehlt doch komplett.


RaspberryPi 4 (Raspian Buster)FHEM+Homebridge
HMLAN für Homematic
Z-Wave USB Stick
Shelly Devices
Fritz!Box 7590Ax

maxritti

Zitat von: moonsorrox am 02 Dezember 2014, 00:39:14
naja...  :-\ das mit den Klammern erscheint mir schon logisch, aber funktioniert eben nicht, vllt geht das nicht mit dem RandomTimer..?

Das kann doch gar nicht funktionieren.
Randomtimer ist ein eigenständiges Modul. Damit muss halt ein neues Device definiert werden, welches dann eben einen solchen RandomTimer definiert, wo wann was passieren soll.
Da sehe ich mal keinen direkten Zusammenhang zwischen DOIF und Randomtimer.

Passt ja jetzt nicht wirklich hier hin, aber ich habe das so gelöst.
Mit einem Dummy sage ich meinem Fhem, ob ich in Urlaub bin oder nicht (Verreist = ja oder nein).
Dann habe ich einen Randomtimer, der im Attribut disableCond eine Funktion isVerreist() abfragt, welche 0 oder 1 zurückliefert eben den Status von meinem Urlaubsdummy.
Damit ist der Randomtimer ein oder aus. Und im Timer selber steht dann das Device welches zu der  Zufallszeit geschaltet werden soll.

moonsorrox

#808
Zitat von: Jens_B am 02 Dezember 2014, 07:25:45
das fehlt doch komplett.
ja natürlich ist das klar, darum ging es mir ja auch gar nicht..!  ;)
etwas OT
und klar fehlt ein set <device> on/off oder wie auch immer, aber wenn du mal in ein Code oder commandref zu RT schaust steht auch nichts mit set oder on/off
hier mal ein Beispiel:
*{sunset_abs("CIVIL",1800,"17:00","22:20")} AussenLampe 01:05:00 900 700/100

eine ganz einfache Schaltung mit dem DOIF ist ja auch kein Problem... siehe unten was ich erreichen wollte

Zitat von: maxritti am 02 Dezember 2014, 08:07:02
Randomtimer ist ein eigenständiges Modul. Damit muss halt ein neues Device definiert werden, welches dann eben einen solchen RandomTimer definiert, wo wann was passieren soll.
das ist schon klar, aber ich wollte eben diese Zufallssteuerung/RT in das DOIF einbauen.. ;)

Zitat von: maxritti am 02 Dezember 2014, 08:07:02
Da sehe ich mal keinen direkten Zusammenhang zwischen DOIF und Randomtimer.
vollkommen richtig

Zitat von: maxritti am 02 Dezember 2014, 08:07:02
Passt ja jetzt nicht wirklich hier hin, aber ich habe das so gelöst.
Mit einem Dummy sage ich meinem Fhem, ob ich in Urlaub bin oder nicht (Verreist = ja oder nein).
Dann habe ich einen Randomtimer, der im Attribut disableCond eine Funktion isVerreist() abfragt, welche 0 oder 1 zurückliefert eben den Status von meinem Urlaubsdummy.
Damit ist der Randomtimer ein oder aus. Und im Timer selber steht dann das Device welches zu der  Zufallszeit geschaltet werden soll.
das hatte ich ja gestern geschrieben, was ich erreichen möchte.
Ich habe damit aber zwei Dummy und wollte das verbinden...

Also ich habe einen RandomTimer der funktioniert... und ich habe für diese Beleuchtung oben ein Dummy
Dummy Code:
#### Zeitsteuerung Dummy ###
define Zeitsteuerung dummy
attr Zeitsteuerung alias Zeitsteuerung aktivieren
attr Zeitsteuerung devStateIcon Aus:general_aus@lightgreen Dämmerung:weather_sunrise@blue Zufall:general_an_fuer_zeit@Crimson
attr Zeitsteuerung eventMap Aus Dämmerung Zufall
attr Zeitsteuerung group Aussen Beleuchtung
attr Zeitsteuerung icon time_clock
attr Zeitsteuerung room Automation
attr Zeitsteuerung setList state:Aus,Dämmerung,Zufall
attr Zeitsteuerung sortby 01
attr Zeitsteuerung webCmd state


jetzt wollte ich eben erreichen mit dem DOIF das es ein absolutes "Aus" eine Schaltung bei Anwesenheit die sich bei mir im Dummy "Dämmerung" nennt und eben die für "Zufall"
"Aus" und "Dämmerung" funktioniert super und nun wollte ich den RandomTimer/Code für "Zufall" mit ins DOIF integrieren damit ich nicht zwei verschiedene Devices betätigen muss, nämlich einmal RT und einmal meine DOIF Schaltung.
Beides wollte ich zusammen bringen, ich hoffe ich habe es verständlich ausgedrückt...

Somit kann ich eben über die setList einstellen was ich möchte "Aus", Normale Schaltung wenn ich zuhause bin "Dämmerung" und wenn abwesend "Zufall" wobei eben Zufall der RT sein sollte... das bekomme ich allein eben nicht gebacken..

Deshalb ja auch immer meine Frage geht das überhaupt den Code vom RT ins DOIF einzubauen..?
Intel-NUC i5: FHEM-Server 6.1 :: Perl v5.18.2

Homematic: HM-USB-CFG2,HM-CFG-LAN Adapter, HM-LC-BL1-FM, HM-LC-Sw1PBU-FM, HM-LC-Sw1-PI-2, HM-WDS10-TH-O, HM-CC-TC, HM-LC-SW2-FM

maxritti

Zitat von: moonsorrox am 02 Dezember 2014, 15:00:53
Deshalb ja auch immer meine Frage geht das überhaupt den Code vom RT ins DOIF einzubauen..?

Aus meiner Sicht kann man die Frage klar mit NEIN beantworten.

Zitat von: Brockmann am 29 November 2014, 16:29:30
Woraus Du nicht schließen solltest, dass das "*" richtig wäre. Immerhin bekommst Du ohne * eine andere Fehlermeldung. Und das hatte ich Dir ja auch angekündigt.
Nein, sicher kannst Du das so nicht schreiben. Aber wo soll ich anfangen? Ich vermute, Du möchtest auf diese Weise RandomTimer ins Spiel bringen. Das kann so aber nicht funktionieren. Bitte lies Dir die Commandref zu RandomTimer in aller Ruhe durch und versuche das Konzept zu verstehen. Mit einem set auf einen Schalter wirst Du keinen RandomTimer hinbekommen. Der wird als eigenes Objekt definiert. Darin taucht der zu verwendende Schalter als Parameter auf.
Aber wie ich schon sagte, für den ohnehin schon arg langen DOIF-Thread ist das IMHO völlig off-topic.
Und dem schließe ich mich jetzt auch an und denke für Deine Anforderung solltest Du ein separates Thema erstellen.