Hauptmenü

neues Modul DOIF

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

Vorheriges Thema - Nächstes Thema

satprofi

ja, aber das event bleibt bis abends stehen. wie schaltet dann doif die lampe wieder aus?
habe das ganze mit notify erfolgreich, möchte es mit doif lösen.
gruss
-----------------------------------------------------------------------
beelink miniPC - Fhem 6.x CUL 868, FS20, NetIO230 CUL 433
HMLAN, HM-CC-RT-DN,Homematic Actoren,LD382A,Telegram

Puschel74

Hallo,

schalte die Lampe doch mit einem on-for-timer 7200 ein
Sollte das Gerät kein on-for-timer können lass dir ein at anlegen das 2 Stunden später die Lampe ausschaltet.

Grüße
Zotac BI323 als Server mit DBLog
CUNO für FHT80B, 3 HM-Lan per vCCU, RasPi mit CUL433 für Somfy-Rollo (F2F), RasPi mit I2C(LM75) (F2F), RasPi für Panstamp+Vegetronix +SONOS(F2F)
Ich beantworte keine Supportanfragen per PM! Bitte im Forum suchen oder einen Beitrag erstellen.

satprofi

Zitat von: Puschel74 am 16 August 2014, 11:58:18
Hallo,

schalte die Lampe doch mit einem on-for-timer 7200 ein
Sollte das Gerät kein on-for-timer können lass dir ein at anlegen das 2 Stunden später die Lampe ausschaltet.

Grüße

a) netio kann nur on/off
b) werds mal bei doif versuchen

gruss
gruss
-----------------------------------------------------------------------
beelink miniPC - Fhem 6.x CUL 868, FS20, NetIO230 CUL 433
HMLAN, HM-CC-RT-DN,Homematic Actoren,LD382A,Telegram

Brockmann


define DI_Lampe_an DOIF ([mytwilight:aktEvent] eq "sr_weather") (set Lampe on)
define DI_Lampe_aus DOIF ([Lampe] eq "on"]) (set Lampe off)
attr DI_Lampe_aus wait 7200

Das ist aber nur sinvoll, wenn "Lampe" nicht noch von anderer Seite aus gesteuert wird.
Theoretisch müsste man auch ein einziges DOIF draus machen können, aber da sich das dann quasi selbst triggert, bin ich nicht sicher, ob das klappt.

satprofi

#379
habe es mal so definiert

([myTwilight:aktEvent] eq "sr_weather") ("define Lampe_on at +01:00:00 set AquaLamp3000K on","define Lampe2_on at +03:00:00 set AquaLamp4000K_1 on","define Lampe3_on at +04:00:00 set AquaLamp4000K_2 on)


mal sehen obs klappt.

leider nicht

last_error {"define Lampe_on at +01:00:00 set AquaLamp3000K on","define Lampe2_on at +03:00:00 set AquaLamp4000K_1 on","define Lampe3_on at +04:00:00 set AquaLamp4000K_2 on"}: HASH(0x141c9f8)


so klappts leider auch nicht:


([myTwilight:aktEvent] eq "sr_weather") (define Lampe_on at +01:00:00 set AquaLamp3000K on,define Lampe2_on at +03:00:00 set AquaLamp4000K_1 on,define Lampe3_on at +04:00:00 set AquaLamp4000K_2 on)


ich denke es klappt so:


([myTwilight:aktEvent] eq "sr_weather") (set AquaLamp3000K on)
DOELSEIF ([myTwilight:aktEvent] eq "sr_weather") (set AquaLamp4000K_1 on)
DOELSEIF ([myTwilight:aktEvent] eq "sr_weather") (set AquaLamp4000K_2 on)
DOELSEIF ([10:00]) (set AquaLamp3000K off)
DOELSEIF ([17:00]) (set AquaLamp3000K on)
DOELSEIF ([myTwilight:aktEvent] eq "ss_weather) (set AquaLamp4000K_1 off)
DOELSEIF ([myTwilight:aktEvent] eq "ss_civil) (set AquaLamp4000K_2 off)
DOELSEIF ([21:45]) (set AquaLamp3000K off)


dann wait 3600:10800:14400:0:0:0:0:0

[edit]

mir ist gerade  "sleep" eingefallen
jetzt habe ich das ganze so gelöst


([myTwilight:aktEvent] eq "sr_weather") (set AquaLamp3000K on,sleep 7200,set AquaLamp4000K_1 on,sleep 3600,set AquaLamp4000K_2 on)
DOELSEIF ([10:00]) (set AquaLamp3000K off)
DOELSEIF ([17:00]) (set AquaLamp3000K on)
DOELSEIF ([myTwilight:aktEvent] eq "ss_weather) (set AquaLamp4000K_1 off)
DOELSEIF ([myTwilight:aktEvent] eq "ss_civil) (set AquaLamp4000K_2 off)
DOELSEIF ([21:45]) (set AquaLamp3000K off)


dann wait 3600:0:0:0:0:0




gruss
gruss
-----------------------------------------------------------------------
beelink miniPC - Fhem 6.x CUL 868, FS20, NetIO230 CUL 433
HMLAN, HM-CC-RT-DN,Homematic Actoren,LD382A,Telegram

Brockmann

Hallo Damian,

ich sitze gerade an folgender Definition:

([Wetter_1] or [Wetter_2])
    (
    setreading WETTER humidity {sprintf("%.0f",(([Wetter_1:humidity]+[Wetter_2:humidity])/2))}
    )

Das führt zu folgender Fehlermeldung:
DOIF: no right bracket: {sprintf("%.0f"
Meine Vermutung: DOIF interpretiert das Komma zwischen den Parametern von sprintf als "sein" Komma und beendet die Anweisung an der Stelle, was zur Verstümmelung des sprintf und damit logischerweise zur Fehlermeldung führt.
Wie muss ich das formulieren, um dieses Problem zu vermeiden?
(Sinn des Ganzen ist, vom Durchschnitt der aktuellen Werte nur den ganzzahligen Teil als Reading in einen anderen Dummy zu schreiben.)

Damian

Zitat von: Brockmann am 17 August 2014, 13:18:54
Hallo Damian,

ich sitze gerade an folgender Definition:

([Wetter_1] or [Wetter_2])
    (
    setreading WETTER humidity {sprintf("%.0f",(([Wetter_1:humidity]+[Wetter_2:humidity])/2))}
    )

Das führt zu folgender Fehlermeldung:
DOIF: no right bracket: {sprintf("%.0f"
Meine Vermutung: DOIF interpretiert das Komma zwischen den Parametern von sprintf als "sein" Komma und beendet die Anweisung an der Stelle, was zur Verstümmelung des sprintf und damit logischerweise zur Fehlermeldung führt.
Wie muss ich das formulieren, um dieses Problem zu vermeiden?
(Sinn des Ganzen ist, vom Durchschnitt der aktuellen Werte nur den ganzzahligen Teil als Reading in einen anderen Dummy zu schreiben.)
Perl-Auswertung muss zusätzlich in runde Klammern, also {(....)} -steht so in der Doku. Das musste ich einbauen, da z. B. at selbst geschweifte Klammern für Wiederholungen nutzt.
Gruß
Damian
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Brockmann

Zitat von: Damian am 17 August 2014, 14:17:04
Perl-Auswertung muss zusätzlich in runde Klammern, also {(....)} -steht so in der Doku. Das musste ich einbauen, da z. B. at selbst geschweifte Klammern für Wiederholungen nutzt.
Das habe ich schon probiert.

([Wetter_1] or [Wetter_2])
    (
    setreading WETTER humidity {(sprintf("%.0f",(([Wetter_1:humidity]+[Wetter_2:humidity])/2)))}
    )

Ergibt
DOIF: no right bracket: {(sprintf("%.0f"

Damian

Zitat von: Brockmann am 17 August 2014, 14:28:38
Das habe ich schon probiert.

([Wetter_1] or [Wetter_2])
    (
    setreading WETTER humidity {(sprintf("%.0f",(([Wetter_1:humidity]+[Wetter_2:humidity])/2)))}
    )

Ergibt
DOIF: no right bracket: {(sprintf("%.0f"

OK. Damit Komma bei FHEM-Befehlen nicht als Trennzeichen gilt, so muss der FHEM-Befehl, wie bei IF, zusätzlich in runde Klammern, also ((setreading...))

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

Brockmann

Zitat von: Damian am 17 August 2014, 15:09:38
OK. Damit Komma bei FHEM-Befehlen nicht als Trennzeichen gilt, so muss der FHEM-Befehl, wie bei IF, zusätzlich in runde Klammern, also ((setreading...))
Ah, OK, es gibt immer noch eine Variante, auf die man nicht kommt.  ;)

Komplett muss die Klammerarie übrigens so aussehen, damit dann auch der Wert und nicht der Ausdruck im Reading landet:

([Wetter_1] or [Wetter_2])
    (
    (setreading WETTER humidity ({(sprintf("%.0f",(([Wetter_1:humidity]+[Wetter_2:humidity])/2)))}))
    )

Falls jemand eine Möglichkeit sieht, die eine oder andere Klammer noch loszuwerden, immer her damit.
Ich meine, das ")))}))" am Ende der Zeile darf man wirklich niemandem zeigen, oder?
Ohne Editor mit Bracket-Matching kann man sich da gleich die Kugel geben.

Naja, jetzt läuft es jedenfalls... Danke für die Unterstützung.

Damian

#385
Zitat von: Brockmann am 17 August 2014, 17:50:19
Ah, OK, es gibt immer noch eine Variante, auf die man nicht kommt.  ;)

Komplett muss die Klammerarie übrigens so aussehen, damit dann auch der Wert und nicht der Ausdruck im Reading landet:

([Wetter_1] or [Wetter_2])
    (
    (setreading WETTER humidity ({(sprintf("%.0f",(([Wetter_1:humidity]+[Wetter_2:humidity])/2)))}))
    )

Falls jemand eine Möglichkeit sieht, die eine oder andere Klammer noch loszuwerden, immer her damit.
Ich meine, das ")))}))" am Ende der Zeile darf man wirklich niemandem zeigen, oder?
Ohne Editor mit Bracket-Matching kann man sich da gleich die Kugel geben.

Naja, jetzt läuft es jedenfalls... Danke für die Unterstützung.

(setreading WETTER humidity ({(sprintf("%.0f",(([Wetter_1:humidity]+[Wetter_2:humidity])/2)))}))

Die vier roten Klammern können weg.

Je komplexe die Ausdrücke, desto schwierige wird es kompatibel zu bleiben. Irgendwann kann man auch gleich mit {fhem("...."} arbeiten, allerdings sind diese zusammengebauten Ausdrücke meistens auch nicht kürzer.

Die Historie ist ganz einfach:

Gäbe es die Vervielfachungs-Problematik mit Semikolons bei FHEM nicht, dann hätte ich Semikolon statt Komma als Trennzeichen genommen.

Gäbe es das Komma nicht als Trennzeichen, müsste ich nicht auf die Kompatibilität zu FHEM-Befehlen achten,

Müsste ich nicht auf die Kompatibilität der FHEM-Befehle achten, bräuchte man nicht zusätzliche runde Klammern angeben

usw.

Vielleicht überlege ich mir noch eine vereinfachte Syntax für die Formatierung von Zahlen.


Gruß

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

Brockmann

Zitat von: Damian am 17 August 2014, 18:14:19
(setreading WETTER humidity ({(sprintf("%.0f",(([Wetter_1:humidity]+[Wetter_2:humidity])/2))])}))
Die vier roten Klammern können weg.
Also die beiden äußeren müssen bleiben, meine ich. Die habe ich extra eingefügt, als ich im Reading (sprintf("%.0f",(([Wetter_1:humidity]+[Wetter_2:humidity])/2))) anstelle des gewünschten Wertes stehen hatte. Aber die inneren müssten tatsächlich verzichtbar sein. Mal sehen, ob ich mich traue, da nochmal ran zu gehen.  ;)

Meine Anmerkungen waren übrigens auch gar nicht so kritisch gemeint. Mir ist schon klar, dass manche Probleme komplexe Lösungen erfordern.
Aber wenn Du noch Spielraum für Vereinfachung siehst, umso besser.
Wobei das ja nun auch keine Aufgabenstellung ist, die ein Paradebeispiel für die Verwendung von DOIF darstellt. Ich verwende es aber immer gerne, wenn es um Readings geht, weil der Zugriff darauf per DOIF deutlich einfacher und besser lesbar ist.

Damian

#387
Zitat von: Brockmann am 17 August 2014, 18:25:16
Also die beiden äußeren müssen bleiben, meine ich. Die habe ich extra eingefügt, als ich im Reading (sprintf("%.0f",(([Wetter_1:humidity]+[Wetter_2:humidity])/2))) anstelle des gewünschten Wertes stehen hatte. Aber die inneren müssten tatsächlich verzichtbar sein. Mal sehen, ob ich mich traue, da nochmal ran zu gehen.  ;)

Meine Anmerkungen waren übrigens auch gar nicht so kritisch gemeint. Mir ist schon klar, dass manche Probleme komplexe Lösungen erfordern.
Aber wenn Du noch Spielraum für Vereinfachung siehst, umso besser.
Wobei das ja nun auch keine Aufgabenstellung ist, die ein Paradebeispiel für die Verwendung von DOIF darstellt. Ich verwende es aber immer gerne, wenn es um Readings geht, weil der Zugriff darauf per DOIF deutlich einfacher und besser lesbar ist.

Konstruktive Kritik ist immer sinnvoll, da man dadurch immer etwas verbessern kann. Ich bin immer noch der Meinung, dass die roten Klammern weg können. Probiere es mal aus. Wir wollen keinem unnötige Klammern empfehlen.

Aber zunächst eine neue Version 1.7 im ersten Post.

Jetzt werden Befehle einzeln abgearbeitet.

Damit sollte so etwas im Ausführungsteil sauber funktionieren:

(setreading dummy_t test1 on, setreading dummy_t test2 [dummy_t:test1])

Gruß

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

Brockmann

Zitat von: Damian am 17 August 2014, 18:42:08
Ich bin immer noch der Meinung, dass die roten Klammern weg können. Probiere es mal aus. Wir wollen keinem unnötige Klammern empfehlen.
Du hast Recht. Ich musste die Klammern innerhalb der geschwungenen Klammer hinzufügen, damit der Ausdruck ausgewertet wird, nicht außerhalb.

tekki

Zitat von: tekki am 12 August 2014, 19:50:04
Hallo Damian,

ich möchte mich an dieser Stelle für die super Arbeit und das klasse Modul bedanken. Es erleichtert mir meine Umsetzungen erheblich  :)

In den Posts habe ich von der Errormeldung beim Einsatz von Pushmsg gelesen. Ich setze es auch ein und bekommen mit Version 1.61 auch noch den Error. Die Mitteilung wird aber geschickt.

DEF 
([05:05] or [12:00] or [19:00]) (set Push_msg msg 'Test' 'Das ist ein Test'' '' 0 '')

error set Push_msg msg 'Test' 'Das ist ein Test'' '' 0 '': OK

Ich kann damit leben, wollte es Dir nur zur Info mitteilen.

Grüße
Ralph

Hallo Damian,

ich habe hierzu noch einmal eine Frage. Kann es sein das durch den von Push_MSG verursachten Error, die weiteren Nachrichten nicht mehr versendet werden.
Immer wenn ich in der DEF auf modify klicke, wird das DOIF neu initialisiert und sendet einmal die Nachricht zur nächsten Zeitpunkt. Dann erscheint der Error und es kommen keine weiteren Nachrichten. Klicke ich erneut in der DEF wieder auf modify, versendet das DOIF zum nächsten Zeitpunkt wieder eine Nachricht.
Oder habe ich in meiner DEF einen Fehler. Ziel ist es, dass ich zu mehreren Zeitpunkten eine Erinnerungs-Nachricht bekommen möchte.

Grüße
Ralph