Befehle on, off in webcmd ummappen auf eine eigene Funktion - wie geht das ?

Begonnen von eddie1104, 18 Mai 2016, 16:25:49

Vorheriges Thema - Nächstes Thema

eddie1104

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 ?

justme1968

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
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

Otto123

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
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

CoolTux

Und genau das was Otto gerade beschrieben hat macht ein Modul von Elektrolurch
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

eddie1104

@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.

justme1968

schau dir event-on-change-reading an. dann gibt es auch kein event wenn die lampe schon an ist.
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

Otto123

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
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

eddie1104

@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"...}

MadMax-FHEM

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
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)

Otto123

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
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

eddie1104

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 ?

justme1968

du siehst doch das bei state das set_ dazwischen funkt.

nimm als reading level oder pct statt state dann funktioniert es.

gruss
  andre
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

eddie1104

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.

CoolTux

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.
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

eddie1104

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?