Ich habe eine Funktion geschrieben, mit der ich Verbräuche der Lampen errechne und in eine Datenbank schreiben. Dann habe ich mir gedacht dass ich mit notify nun meine Funktion aufrufen kann. Ich komme auch in meine Funktion hinein aber dann stelle ich dort fest, dass die Lampe schon eingeschaltet ist.
Hier das Beispiel für das Einschalten :
define do_cond_mein_licht_1_on notify Licht_1:on {meine_funktion "Licht_Sejour_1", "on", "", "", "", "on"}
In meiner Funktion teste ich z.B. ob die Lampe schon eingeschaltet ist weil ja dann die Einschaltzeit schon früher lag. Dabei lasse ich mir den Status meines Devices ausgeben und stelle fest, dass die Lampe schon eingeschaltet ist.
Daraus schließe ich, dass das Notify dem eigentlichen Schaltbeffehl nachgelagert ist. Und ich frage mich, wie ich den eingebauten Einschaltbefehl deaktivieren kann und durch meine eigene Funktion ersetzen kann.
Im Forum habe ich noch kein ähnliches Thema gefunden und auch in der Befehlsreferenz finde ich nichts, was mir weiterhilft. Hat irgend einer eine gute Idee ?
das notify kommt sekundenbruchteile nah dem der schalt befehl raus ist.
wenn dir dir wirklich gedanken um diese Verzögerung machst solltest du auch berücksichtigen das dir lampe auch mit verzögerung schaltet weil z.b. eine funkstrecke dazwischen ist, weil eventuell erst beim wiederholen geschaltet wird weil es eine funk störung gab, weil der aktor zeit braucht zu zu reagieren oder weil er langsam hoch dimmt.
aber das alles passiert doch innerhalb von 1 oder höchstens 2 sekunden und ist für den verbrauch nicht wirklich relevant.
übrigens gibt es im forum zwei module die genau so eine verbrauchs berechnung schon machen.
gruss
andre
Hi,
was ich nicht verstehe ist, warum willst Du webcmd um mappen?
Du willst doch den Verbrauch errechen: Deine Funktion muss also den Start ermitteln wenn die Lampe angeht (Zeit feststellen) und den Stop ermitteln wenn die Lampe ausgeht. Die Differenz bringt dir mit der Leistung den Energieverbrauch.
Eigentlich muss doch Dein notify an und aus ermitteln und die Zeitpunkte in die Datenbank schreiben, alles andere kann in der Datenbank passieren.
Gruß otto
Und genau das was Otto gerade beschrieben hat macht ein Modul von Elektrolurch
@justme
Es kann sein, dass ich die Lampe schon eingeschaltet habe, dann muss ich den Startzeitpunkt auf das erste Einschalten synchroniseren. Wennn ich jetzt erst teste, ob die Lampe schon an ist und dann gar nichts mehr mache, dann ist alles OK.
@Otto und CoolTux
Ich benutze ein zentrales Modul, was ich standardmäßig in meiner Anwendung für alle möglichen Gruppen (Dummy-Devices) nutze und dabei funktioniert das ganze wunderbar. Nur, wenn ich direkt einen HomeMatic Switch anspreche (mit dem Hardware-Schalter oder aus der Weboberfläche), dann bekomme ich eben diese Probleme.
Ich würde also gerne mein Modul weiter verwenden, das auch mit meiner Datenbank optimal kommuniziert. Wenn es wirklich keine Möglichkeit gibt, die eingebauten Commandos on und off zu deaktivieren, dann werde ich mein Modul umschreiben müssen. Theoretisch könnte ich natürlich auch zu jedem Hardware-Device ein Dummy-Device erzeugen, mit dem mein Modul perfekt zusammenarbeitet. Abe das wäre wirklich die letzte Möglichkeit.
schau dir event-on-change-reading an. dann gibt es auch kein event wenn die lampe schon an ist.
Zitat von: eddie1104 am 18 Mai 2016, 18:07:22
Wenn es wirklich keine Möglichkeit gibt, die eingebauten Commandos on und off zu deaktivieren, dann werde ich mein Modul umschreiben müssen. Theoretisch könnte ich natürlich auch zu jedem Hardware-Device ein Dummy-Device erzeugen, mit dem mein Modul perfekt zusammenarbeitet. Abe das wäre wirklich die letzte Möglichkeit.
Ich verstehe Dich immer noch nicht, ich glaube wir reden aneinander vorbei.
Du willst vielleicht die events um mappen? Also Du willst aus on -> willi und aus off -> wurst machen?
Oder willst Du nur doppelte Events also on on unterdrücken? Dann hilft der Tipp von justme1968
@Otto
Ich möchte aus on -> willi machen und aus off -> wurst.
also sinngemäß
on -> {meine_funktion "device" "on" "par3" "par4"...}
off -> {meine_funktion "device" "off" "par3" "par4"...}
Wenn du willst, dass das 'on/off' eines Senders (Taster, Schalter, Sensor, ...) nicht direkt das 'on/off' eines Aktors auslöst (so verstehe ich das was du willst), dann kannst du über ein notify (DOIF?) arbeiten.
Sender schickt 'on' an fhem -> notify erkennt das und ruft die von dir gewünschte Funktion...
Allerdings funktioniert dann der Sender (beispielsweise Schalter) nur, wenn fhem läuft (also beipsielsweise RaspPi kaputt -> kein Licht) UND mit Verzögerung (nicht viel je nach fhem-Serverplattform und Funkverkehr aber halt mehr als direkt gekoppelt)...
Gruß, Joachim
Zitat von: eddie1104 am 19 Mai 2016, 09:38:29
@Otto
Ich möchte aus on -> willi machen und aus off -> wurst.
also sinngemäß
on -> {meine_funktion "device" "on" "par3" "par4"...}
off -> {meine_funktion "device" "off" "par3" "par4"...}
Naja dann mach einfach ein notify, setze "event-on-change-reading state" als attribute von dem jeweiligen Schalter und frage
nicht den Status ab.
Durch event-on-change-reading wird nur ein event erzeugt wenn sich der Status ändert: also Schalter ist on und wird off dann triggert das notify und du weißt jetzt ist off. Kommt noch fünfmal off passiert nichts erst wenn wieder on kommt kommt der neue trigger.
Nimm den eventmonitor und schau dir die events an, bevor du blind am notify bastelst!
Aber um es nochmal deutlich zu sagen, Du willst und brauchst nichts um mappen, du willst bei Betätigung des Schalters eine Funktion auslösen und zwar nur wenn der Status sich ändert. Das ist die Aufgabe die ich jetzt verstanden habe.
Gruß Otto
Ich habe das jetzt mal ausprobiert mit dem event-on-change-reading. Hier ist mein Code aus der fhem.cfg
define Licht_Sejour_1 CUL_HM 3CA95301
attr Licht_Sejour_1 userattr lightSceneParamsToSave lightSceneRestoreOnlyIfChanged:1,0
attr Licht_Sejour_1 alias Licht Esszimmer Eingang
attr Licht_Sejour_1 cmdIcon on:on off:off
attr Licht_Sejour_1 devStateIcon on:on off:off
attr Licht_Sejour_1 event-on-change-reading state
attr Licht_Sejour_1 group 1 Beleuchtung Wohnbereich
attr Licht_Sejour_1 icon led_mais
attr Licht_Sejour_1 model HM-LC-SW2-FM
attr Licht_Sejour_1 peerIDs 00000000,3CA95301,
attr Licht_Sejour_1 room Gaas
attr Licht_Sejour_1 sortby 1
attr Licht_Sejour_1 webCmd statusRequest:toggle:on:off
define do_cond_Licht_Sejour_1_on notify Licht_Sejour_1:on {do_switch_cond "Licht_Sejour_1", "on", "", "", "", "on"}
define do_cond_Licht_Sejour_1_off notify Licht_Sejour_1:off {do_switch_cond "Licht_Sejour_1", "off", "", "", "", "on"}
Aber ich bekomme im Eventlog egal wie oft ich off drücke immer wieder folgendes :
CUL_HM Schalter_Sejour_1 CMDs pending
CUL_HM Licht_Sejour_1 set_off
CUL_HM Licht_Sejour_1 off
CUL_HM Schalter_Sejour_1 CMDs done
Wenn ich das richtig interpretiere heißt das doch, dass ich trotzdem immer ein Event auslöse. Ist meine Syntax vielleicht falsch ?
du siehst doch das bei state das set_ dazwischen funkt.
nimm als reading level oder pct statt state dann funktioniert es.
gruss
andre
Wenn ich reading nehme oder pct, dann geht zwar meine Lampe an, aber das notify auf meine Funktion geht nicht mehr. Ich möchte aber, dass meine Funktion die Lampe kontrolliert ein- bzw. ausschaltet.
Wie genau sieht denn Dein Notify aus. Du solltest glaube nicht Deine Funktion anpassen sondern lediglich das Notify. Also auf was das Notify triggern soll. Deine Funktion kannst Du ja auf STATE belassen.
Hm, ich glaube CoolTux, das verstehe ich nicht so richtig. In diesem Define
define do_cond_Licht_Sejour_1_on notify Licht_Sejour_1:on {do_switch_cond "Licht_Sejour_1", "on", "", "", "", "on"}
triggere ich doch auf das was Device Licht_Sejour_1 macht, also auf dessen Status. Was kann ich denn jetzt ändern?
Zitat von: eddie1104 am 20 Mai 2016, 10:51:47
Wenn ich reading nehme oder pct, dann geht zwar meine Lampe an, aber das notify auf meine Funktion geht nicht mehr. Ich möchte aber, dass meine Funktion die Lampe kontrolliert ein- bzw. ausschaltet.
Du erwähnst hier ein Notify auf Deine Funktion.
define do_cond_Licht_Sejour_1_on notify Licht_Sejour_1:on {do_switch_cond "Licht_Sejour_1", "on", "", "", "", "on"}
Das hier reagiert ja nur auf ein on. Also im besten Sinne.
define do_cond_Licht_Sejour_1_on notify Licht_Sejour_1:.(on|off) {do_switch_cond "Licht_Sejour_1", "on", "", "", "", "on"}
Das hier reagiert auf on und off von Licht_Sejour_1
Wenn also das Device Licht_Sejour_1 ein on pder ein off bekommt startet es die eigene Sub. Ist es das was passieren soll?
Ansonsten hatte ich noch gelesen das Du das Device in der Sub noch mal abfragen willst, das wiederum kann man dann in der Tat mit den Readings pct oder level machen.
du musst dein notify natürlich auf das verwendete reading umstellen. also z.b. so:
define do_cond_Licht_Sejour_1_on notify Licht_Sejour_1:pct.100 {do_switch_cond "Licht_Sejour_1", "on", "", "", "", "on"}
und für pct 0 entsprechend.
und du musst in deiner routine den zustand nicht noch mal abfragen. den bekommst du doch mit dem notify.
Ich glaube jetzt haben wir ihn durcheinander gebracht. Kurze Frage Andre, warm eigentlich pct im Notify? Ich kann doch die RegEx so setzen das er wirklich nur auf ein on oder ein off reagiert.
weil wegen dem set_ event-on-change nicht greift und deshalb zwei mal auf off senden trotzdem zwei events erzeugt. selbst wenn das ding schon aus ist.
pct oder level haben keinen zwischen zustand und event-on-change greift.
gruss
andre
Alles klar. Danke Dir für den Tip.
Dann also das Notify auf pct umstellen. Und wenn man an und aus haben will dann halt 100 und 0
Jetzt nochmal "blöd" nachgefragt zum eigentlichen Threadtitel: Was muss ich machen, um aus einem
webCmd on:off
was ja
set DEVICE on bzw. set DEVICE off
entspricht, ein
defmod at blakeks
zu machen?
Ich nehme an, das geht mit webCMD nicht? Muss man hier auf Readingsgroup oder ähnliches ausweichen?
Du willst einen dummy on oder off setzen und bei einer dieser Aktionen soll ein: defmod at blakeks rauskommen?
Dann würde ich ein notify auf dummy:on triggern und in dem kann alles passieren...
webcmd mappt nur die Befehle um
Aber ich habe den alten Thread jetzt nicht nochmal gelesen :-X
Gruß Otto
notify. oder cmdalias
Das war ein Extrembeispiel zur Verdeutlichung. Ich habe einen cmdalias namens setex, der ein normales set aufruft, vorher aber ein Reading setzt. Deswegen kann ich hier auch kein Notify verwenden. Und auch keinen weiteren cmdalis (denke ich).
Ich brauche anstelle von set DEVICE on "einfach" setex DEVICE on parameter1