Hauptmenü

Event in inform timer

Begonnen von frank1, 15 Juli 2013, 15:25:30

Vorheriges Thema - Nächstes Thema

frank1

Hallo zusammen,

ich habe einen trigger der einem "Dummy" button "Teich_fuellen" ausschaltet, sobald ein trigger event eintritt.
Es wird die Aktion { fhem "set Teich_fuellen off"  } ausgeführt.

Leider erzeugt innerhalb des triggers das set Kommando kein "inform timer" event.
Wenn es manuell ausgeführt wird erzeugt es den passenden Eintrag. Inform timer Ausgaben werden von einer angeschalteten
Applikation ausgewertet und wird daher benötigt.

Kann es durch ein attribut ggf. gesteuert werden das ein event erzeugt wird ?


fhem> { fhem "set Teich_fuellen off" }
2013-07-15 15:21:48 dummy Teich_fuellen off
fhem>




fhem> list Teich_ventil_off
Internals:
   DEF        Bewaesserung_Teich_Ventil:off.* { \
        { fhem "set Teich_fuellen off" } \
        }
   NAME       Teich_ventil_off
   NR         108
   NTFY_ORDER 50-Teich_ventil_off
   NTFY_TRIGGERTIME 2013-07-15 15:11:13
   REGEXP     Bewaesserung_Teich_Ventil:off.*
   STATE      active
   TYPE       notify
Attributes:
   forwardReturnValue 1

fhem>

betateilchen

Zitat von: frank1 schrieb am Mo, 15 Juli 2013 15:25Internals:
   DEF        Bewaesserung_Teich_Ventil:off.* { \
        { fhem "set Teich_fuellen off" } \
        }


Spontan würde ich sagen, da fehlen zwei Klammern:

{ fhem("set Teich_fuellen off") }
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Zrrronggg!

Was soll
DEF Bewaesserung_Teich_Ventil:off.* { \
{ fhem "set Teich_fuellen off" } \
}


überhaupt sein? Also ich meine "DEF" ?   Müsste das nicht "define..." heissen?  Und ausserdem ist das kein define, dann das müsste ja so aufgebaut sein:

define <name> notify <auslösung> set irgendwas  xy

Ausserdem

ZitatUnd Es wird die Aktion { fhem "set Teich_fuellen off" } ausgeführt.

ist irgendwie nicht falsch, aber auch nicht ganz richtig. Warum? Lass mich ausholen.


Wir nutzen eine Software namens Fhem. Diese könnte eine Akton wie set Teich_fuellen off ausführen.
In Fällen wo Funktionen die Fhem NICHT anbietet (insobesondere IF-Bedingungen) genutz werden sollten, muss man PERL verwenden.

Das wird durch die geschweiften Kalmern ausgedrückt, alles was zwischen  { } steht ist PERL. Perl kann aber keine Fhem Geräte schalten. Daher kan man PERL sagen, es soll die Befehle wie  
set Teich_fuellen off
wieder an Fhem weitergeben, denn Fhem kann das.

Das würde dann so aussehen:

{ fhem ("set Teich_fuellen off") }
D.H. dieser Ausdrück bedeutet:

Fhem soll bitte Perl sagen          ------->      { }
PERL soll bitte Fhem sagen          ------->       fhem( )
Fhem soll bitte xy machen          ------->      "xy"

Kling umständlich oder sogar sinnlos?
Ist es meistens auch.

Die Involvierung von PERL ist nur sinnvoll, wenn es für PERL auch was zu tun gibt. Das ist bei dir vermutlich nicht der Fall.

Um dir einen Vorschlag zu machen wie das konkret aussehen muss, müsstest du aber genauer sagen, was du machen willst.

Zitatich habe einen trigger

Nämlich welchen?

Zitatder einem "Dummy" button "Teich_fuellen" ausschaltet

Es geht nur darum einen Dummy auszuschalten? Also nur um Anzeige im Web oder so?

Zitatsobald ein trigger event eintritt.

Nämlich welches?

ZitatEs wird die Aktion { fhem "set Teich_fuellen off" } ausgeführt.

Siehe meine Ausführungen oben und ausserdem denke ich es soll nur ein Dummy ausgeschaltet werden?

Bitte: ich weiss das klingt haarspalterisch, aber wenn wir hier helfen sollen, müssen wir genau wissen was du machen willst. Und das hast du zumindest für mich nicht verständlich dargestellt.



FHEM auf Linkstation Mini, CUL 868 SlowRF, 2xCUL 868 RFR, CUL 433 für IT, 2xHMLAN-Configurator mit VCCU, ITV-100 Repeater, Sender und Aktoren von FHT, FS20, S300, HM, IT, RSL

betateilchen

Zitatüberhaupt sein? Also ich meine "DEF" ? Müsste das nicht "define..." heissen? Und ausserdem ist das kein define, dann das müsste ja so aufgebaut sein:

das ist auch kein define, sondern die Listausgabe, die man erhält, wenn man ein "list Teich_ventil_off" ausführt.

fhem> list Teich_ventil_off
Internals:
DEF Bewaesserung_Teich_Ventil:off.* { \
{ fhem "set Teich_fuellen off" } \
}


Und genau das hat der Fragesteller getan und auch eindeutig in seinem Eröffnungsbeitrag geschrieben.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

frank1

Hallo ,

hier das define.
Ich habe es auch mit Klammern versucht, ohne erfolg.


define Teich_ventil_off notify Bewaesserung_Teich_Ventil:off.* { \
        { fhem("set Teich_fuellen off") } \
        }


Der "dummy" button ist ein FS20 button ohne funktion.

define Teich_fuellen FS20 9876 02

Der button "Teich_fuellen" schaltet die Teich Bewaesserung ein und läuft rund 90 sekunden.
(Schaltet Pumpe und Ventil mit set on-for-timer)



Sobald nun das Ventil nach 90 Sekunden automatisch abschaltet und per HMLAN ein "off"
sendet wird der Trigger Teich_ventil_off ausgelöst. Dort soll der dummy Button "Teich" füllen
auf off gesetzt werden.

Klappt auch soweit, nur die Applikation die per Web die status änderungen monitort mittels http://<fhemweb>?XHR=1&inform=console
bekommt KEIN EVENT "FS20 Teich_fuellen off" um den status des Button zu setzen.

Manuell ausgelöst sieht es so aus.

fhem>  trigger Teich_ventil_off
2013-07-15 16:25:09 notify Teich_ventil_off
fhem> set Teich_fuellen off
2013-07-15 16:25:20 FS20 Teich_fuellen off
fhem>


Fragestellung: Welche Änderungen werden mit "inform timer"  angezeigt und sind Aktionen innerhalb eines Triggers davon ausgenommen ? Laut fhem doku
"Wenn auf "on" gesetzt und der Status eines Gerätes ändert sich, dann wird eine Nachricht an den Client gesendet. Dieser Befehl kann von anderen Programmen/Modulen dazu benutzt werden, eine Hinweisnachricht zu erhalten."


Zrrronggg!

ZitatUnd genau das hat der Fragesteller getan und auch eindeutig in seinem Eröffnungsbeitrag geschrieben.
Okay, mein Fehler. Ich hätte es aber gut gefunden, wenn das konkrete define im Eingangspost niedergeschrieben gewesen wäre.

ZitatIch habe es auch mit Klammern versucht, ohne erfolg.


define Teich_ventil_off notify Bewaesserung_Teich_Ventil:off.* { \
{ fhem("set Teich_fuellen off") } \
}

Ich würde erstmal schreiben:
define Teich_ventil_off notify Bewaesserung_Teich_Ventil:off.* set Teich_fuellen off

Das reicht. Involvierung von Perl brauchts hier nicht. Am Besten in einer Zeile und Probleme mit verdeckten Zeichen im Zeilenumbruch zu vermeiden.

ZitatDer "dummy" button ist ein FS20 button ohne funktion.
define Teich_fuellen FS20 9876 02
Mach ich auch oft so, aber wenn der Tatsächlich nur als Dummy eingesetzt werden soll, dann reicht auch ein echter Dummy (muss man keine FS20 Aktor anlegen) Ist aber für die Funktion egal.

Dein Logfile Auszug sieht aber so aus, als ob alles richtig funktionieren würde.

ZitatFragestellung: Welche Änderungen werden mit "inform timer" angezeigt und sind Aktionen innerhalb eines Triggers davon ausgenommen ?
Nicht das ich wüsste. Gerade bei mir mal nachgesehen: Wenn ich in der Küche das FS20 Ku_Licht1 einschalte wird durch einen define...notivy auch das HM Licht2_Kueche eingeschaltet.

Das taucht in inform timer auf:

2013-07-15 17:10:46 FS20 Ku_Licht1 on
2013-07-15 17:10:47 CUL_HM Licht2_Kueche deviceMsg: on
2013-07-15 17:10:47 CUL_HM Licht2_Kueche on

ZitatLaut fhem doku
"Wenn auf "on" gesetzt und der Status eines Gerätes ändert sich, dann wird eine Nachricht an den Client gesendet. Dieser Befehl kann von anderen Programmen/Modulen dazu benutzt werden, eine Hinweisnachricht zu erhalten."

Genau.

Was siehst du denn in inform timer?  Nur das auslösende Event und dann nichts?




FHEM auf Linkstation Mini, CUL 868 SlowRF, 2xCUL 868 RFR, CUL 433 für IT, 2xHMLAN-Configurator mit VCCU, ITV-100 Repeater, Sender und Aktoren von FHT, FS20, S300, HM, IT, RSL

frank1

Ok, konnte das Problem lösen.


define Teich_ventil_off  notify Bewaesserung_Teich_Ventil:off.* { \
         { fhem "set Teich_fuellen off"   } \
        }

Sieht inform timer so aus:

2013-07-15 17:21:15 CUL_HM Bewaesserung_Teich_Ventil level: 0 %
2013-07-15 17:21:15 CUL_HM Bewaesserung_Teich_Ventil deviceMsg: off (to broadcast)
2013-07-15 17:21:15 CUL_HM Bewaesserung_Teich_Ventil off

Habe es wie folgt angepasst

define Teich_ventil_off  notify Bewaesserung_Teich_Ventil:off.* { \
         { fhem "set Teich_fuellen off"   } \
         { fhem "trigger Teich_fuellen off"   } \
        }

Damit ist nun im inform timer auch FS20 Teich_fuellen off enthalten.
Warum zweimal ? Keine Ahnung aber für meine Zwecke kein Problem.

2013-07-15 17:25:02 FS20 Teich_fuellen off
2013-07-15 17:25:02 FS20 Teich_fuellen off
2013-07-15 17:25:02 CUL_HM Bewaesserung_Teich_Ventil level: 0 %
2013-07-15 17:25:02 CUL_HM Bewaesserung_Teich_Ventil deviceMsg: off (to broadcast)
2013-07-15 17:25:02 CUL_HM Bewaesserung_Teich_Ventil off

Zrrronggg!

Einerseits: Schön das es geht.

Andererseits: Es wäre besser, rauszufinden was da los ist udn der Sache auf den Grund zu egehn, anstatt deinen sowieso etwas subobtimalen Code mit weiterem eigentlich notwendigem Kram zu ergänzen...

Aber da du meinen Vorschlag nicht ausprobieren möchtest und auch meine Fragen nicht beantwortest, kann ich dir nicht helfen.

Nun denn: Wenn's dir so reicht, soll's mir recht sein.
FHEM auf Linkstation Mini, CUL 868 SlowRF, 2xCUL 868 RFR, CUL 433 für IT, 2xHMLAN-Configurator mit VCCU, ITV-100 Repeater, Sender und Aktoren von FHT, FS20, S300, HM, IT, RSL

betateilchen

Versuchen wir doch mal, der Sache logisch auf den Grund zu gehen.

Zitat von: frank1 schrieb am Mo, 15 Juli 2013 16:30define Teich_ventil_off notify Bewaesserung_Teich_Ventil:off.* { { fhem("set Teich_fuellen off") } }

Da sind erstmal zuviele geschweifte Klammern - übrigens, Syntaxfehler stehen normalerweise im Logfile!

define Teich_ventil_off notify Bewaesserung_Teich_Ventil:off.* { fhem("set Teich_fuellen off") }

Zitat von: frank1 schrieb am Mo, 15 Juli 2013 16:30Der "dummy" button ist ein FS20 button ohne funktion.

define Teich_fuellen FS20 9876 02

Der button "Teich_fuellen" schaltet die Teich Bewaesserung ein und läuft rund 90 sekunden.
(Schaltet Pumpe und Ventil mit set on-for-timer)

Zu  meinem Verständnis: Werden die Pumpe und das Ventil BEIDE mit on-for-timer 90 Sekunden angeschaltet?

Zitat von: frank1 schrieb am Mo, 15 Juli 2013 16:30nur die Applikation die per Web die status änderungen monitort mittels http://<fhemweb>?XHR=1&inform=console
bekommt KEIN EVENT "FS20 Teich_fuellen off" um den status des Button zu setzen.

Das ist der Punkt, den ich überhaupt nicht verstehe - was willst Du denn mit einem http-Link, um einen Button zu schalten? Kann es sein, dass Du Dir das Leben einfach selber unnötig schwer machst?

-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Zrrronggg!

ZitatDas ist der Punkt, den ich überhaupt nicht verstehe - was willst Du denn mit einem http-Link, um einen Button zu schalten?

Je, genau, Ich nahm aber an, er hat sich einen andere Webseite gebastelt und benutzt nicht das Fhem Frontend.


define Teich_ventil_off notify Bewaesserung_Teich_Ventil:off.* { fhem("set Teich_fuellen off") }


Wie gesagt: Selbst das ist schon eine unnötig komplizierte Form von


define Teich_ventil_off notify Bewaesserung_Teich_Ventil:off.* set Teich_fuellen off

Und ausserdem:

Zitat:off.*

ist vielleicht auch nicht nötig.

HM kann keine "off-for-timer" oder ähnliches, sondern nur "off"

Ich denke daher würde auch

define Teich_ventil_off notify Bewaesserung_Teich_Ventil:off set Teich_fuellen off

reichen. Aber gut: das stört auch nicht, müsse trotzdem gehen.
FHEM auf Linkstation Mini, CUL 868 SlowRF, 2xCUL 868 RFR, CUL 433 für IT, 2xHMLAN-Configurator mit VCCU, ITV-100 Repeater, Sender und Aktoren von FHT, FS20, S300, HM, IT, RSL

betateilchen

Zitat von: Zrrronggg! schrieb am Mo, 15 Juli 2013 19:01Wie gesagt: Selbst das ist schon eine unnötig komplizierte Form von

Damit hast Du grundsätzlich recht, aber man sollte sich von Anfang an einen einheitlichen Programmierstil angewöhnen. Das mit den geschweiften Klammern und fhem() wird immer funktionieren und ist ausserdem bei komplexeren Dingen sehr viel einfacher zu lesen. Vor allem, wenn man seine Programmierung in einem externen Editor erstellt, der in der Lage ist, eine Syntax-Hervorhebung zu machen und damit z.B. Klammerfehler sofort anzuzeigen.

-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Zrrronggg!

Da bin ich eher gegenteiliger Aufassung.

1. Immer PERL involvieren auch wenn's nicht notwendig ist, macht die Sache weder schneller noch übersichtlicher. Zusätzlich schafft man sich Möglichkeiten für Fehler in der Mischung zwischen PERL und Fehm, einige davon können recht fatal sein, wie z.b. ein sleep an falscher Stelle oder Perl-Funktionen in Fhem Code.

2. Es gibt 2 Wege zu korrekter Verwendung von Klammern: Verstehen oder jemand anders Fehler finden lassen. Egal ob dieser "Jemand anders" ein Editor mit Syntax-Hervorhebung ist (oder öfters) Leute hier im Forum: Verstehen ist der bessere Weg. Hier im Forum gibt es so viel Fragen wo Leute wilde und unnötige Klammerorgien verwenden, nur weil sie das woanders abgeschaut haben. Gerade Anfänger verstehen den Code gar nicht, sondern schreiben das nur ab und fügen Klammern nur ein, weil sie meinen das muss so, und das würde den Code funktionstüchtg machen. (Und genau das ist ja auch hier passiert, das Argument ist also gültig) Wenn man nicht weiss, wo was geht, weil man eigentlich nicht weiss wer das Kommando laut Struktur überhaupt ausführt,vertut man sich leicht.

3. Das Argument der Übersichtlichkeit zieht auch nur halb. Es ist zum einen auch Geschmacksache was "Übersichtlich" ist. Ich selbst denke (um am konkreten Beispiel zu bleiben)  ZWEI überflüssige Klammerebenen und Anführungsstriche mehr ist doch eher nicht übersichtlicher.
Umfangreichere if-Schleifen sind sicher als Einzeiler unübersichtlich. Umgekehrt simpelste Einzeiler (wie den hier diskutierten) strukturiert hinzuschreiben bringt an Übersichtlichkeit wenig, erhöht aber die Gefahr von Fehlern. Wir haben hier im Forum einige Threads, wo Leute in den Zeilenumbrüchen verstecke LFs drin hatten oder Leerzeichen etc und der Code dann WEGEN der strukturierten Darstellung nicht mehr funktioniert. So manche Probleme haben sich dann schon wundersamerweise aufgelost, indem man einfach mal den Code als Einzeiler  hingeschrieben hat: Bingo, geht!

ZitatDas mit den geschweiften Klammern und fhem() wird immer funktionieren

Es sei denn jemand kommt auf die Idee mal folgendes zu machen:

anstatt
define xy nitofy schalter set licht1 on ; sleep 5.0 ; set licht2 on

dann nach deiner Manier wie folgt schreibt:

define xy nitofy schalter { \
{ fhem ("set licht1 on") };; \
{ sleep 5.0 };; \
{  fhem ("set licht2 on") };; \
}
(ich hoffe ich habe jetzt die ";;" richtig gesetzt, die letzten sind natürlich in jedem Falle überflüssig, werden aber von vielen hier immer noch angefügt)

Der Code geht nämlich und wurde auch schon so verwendet. Nur das Fhem dann jeweils 5 Sekunden tot ist.
Oder man vergisst die Anfürhrungsstriche. Oder verhaspelt sich, wenn er defines in defines anlegen will.

Ich denke auf Dauer ist es besser die Leute verstehen, wann man was machen muss, anstatt eine Form zu lernen die hoffentlich ohne kapieren irgendwie immer geht. Sonst kriegt man einige Sachen nicht hin (wie z.b. verschachtelte IF Abfragen) bei denen man zusätzliche Klammereben tatsächlich braucht.

Aber selbstverständlich: das ist nur meine Meinung.
Letztlich war auch die Klammergeschichte einer der Teil wo ich damals am längsten dran gekaut habe und auch manchmal heute noch grübele. Daher bin ich heute immer bemüht das zu erklären.






FHEM auf Linkstation Mini, CUL 868 SlowRF, 2xCUL 868 RFR, CUL 433 für IT, 2xHMLAN-Configurator mit VCCU, ITV-100 Repeater, Sender und Aktoren von FHT, FS20, S300, HM, IT, RSL