FHEM Forum

Verschiedenes => Bastelecke => ESP Familie => Thema gestartet von: MichaelO am 22 Februar 2017, 15:17:48

Titel: ESPEasy neues Modul: Status der Schalter bei Neustart fhem
Beitrag von: MichaelO am 22 Februar 2017, 15:17:48
Moin,

ich habe eine Frage zu einem ESP8266-Device mit einem Relais und ESPEasy. Es wurde im ESP ein Switch auf dem (Relais)-GPIO angelegt, um den Schaltzustand anzeigen zu können. In fhem existiert das Gerät, es lässt sich alles schalten.

Wenn nun fhem neu gestartet wird, dann steht das Reading state auf "opened". Das Reading, welches den Status des Switches anzeigen soll, steht auf "gpio". Es wird also nicht abgefragt, welchen Zustand die enstpr. GPIO haben. Erst nach einmaligem Schalten stimmen wieder alle Anzeigen.

Dies bereitet mir Probleme, da ich die Schaltzustände als Bedingungen in DOIF verwende.

Was muss ich tun, damit auch nach fhem Neustart die aktuellen Zustände des ESP abgefragt werden?

Danke
Michael
Titel: Antw:ESPEasy neues Modul: Status der Schalter bei Neustart fhem
Beitrag von: dev0 am 22 Februar 2017, 16:19:28
Zitat
Wenn nun fhem neu gestartet wird, dann steht das Reading state auf "opened".
Works as designed.

Zitat
Das Reading, welches den Status des Switches anzeigen soll, steht auf "gpio".
Könnte mit eventMap zusammenhängen. Zeig mal ein list vom betroffenen Device.
Titel: Antw:ESPEasy neues Modul: Status der Schalter bei Neustart fhem
Beitrag von: MichaelO am 22 Februar 2017, 17:11:32
ZitatWorks as designed.
Wäre ja auch schlecht wenn nicht. But maybe the design has room for improvement.

Hier das Listig nach Neustart fhem:
Internals:
   DEF        192.168.0.230 80 ESPEasyBridge Skynet_Dualswitch_1_Relais2
   HOST       192.168.0.230
   IDENT      Skynet_Dualswitch_1_Relais2
   INTERVAL   300
   IODev      ESPEasyBridge
   NAME       AU_SW_Laterne
   NOTIFYDEV  global
   NR         357
   NTFY_ORDER 50-AU_SW_Laterne
   PORT       80
   STATE      gpio
   SUBTYPE    device
   TYPE       ESPEasy
   VERSION    0.82
   Readings:
     2017-02-22 17:06:55   state           opened
     2017-02-22 15:18:39   status          gpio
   Helper:
     Intat:
       1:
         FN         ESPEasy_statusRequest
         INTERVAL   304
         TRIGGERTIME 22.02.2017 17:11:59
     Received:
Attributes:
   IODev      ESPEasyBridge
   Interval   300
   comment    Relais 2 = GPIO 14
   eventMap   /gpio 14 on:on/gpio 14 off:off
   group      ESPEasy Device
   presenceCheck 0
   readingSwitchText 1
   room       3.7_Aussen
   setState   3
   stateFormat status
   webCmd     on:off


Und so sind die Readings korrekt da, nachdem ich auf "on" und dann "off" geklickt habe:

Internals:
   DEF        192.168.0.230 80 ESPEasyBridge Skynet_Dualswitch_1_Relais2
   ESPEasyBridge_MSGCNT 2
   ESPEasyBridge_TIME 2017-02-22 17:09:58
   ESP_BUILD  147
   ESP_SLEEP  0
   ESP_UNIT   2
   HOST       192.168.0.230
   IDENT      Skynet_Dualswitch_1_Relais2
   INTERVAL   300
   IODev      ESPEasyBridge
   LASTInputDev ESPEasyBridge
   MSGCNT     2
   NAME       AU_SW_Laterne
   NOTIFYDEV  global
   NR         357
   NTFY_ORDER 50-AU_SW_Laterne
   PORT       80
   STATE      off
   SUBTYPE    device
   TYPE       ESPEasy
   VERSION    0.82
   Readings:
     2017-02-22 17:09:58   state           sta: off
     2017-02-22 17:09:58   status          off
   Helper:
     Intat:
       1:
         FN         ESPEasy_statusRequest
         INTERVAL   304
         TRIGGERTIME 22.02.2017 17:11:59
     Received:
       status     1487779798.82189
Attributes:
   IODev      ESPEasyBridge
   Interval   300
   comment    Relais 2 = GPIO 14
   eventMap   /gpio 14 on:on/gpio 14 off:off
   group      ESPEasy Device
   presenceCheck 0
   readingSwitchText 1
   room       3.7_Aussen
   setState   3
   stateFormat status
   webCmd     on:off


Gruß
Michael
Titel: Antw:ESPEasy neues Modul: Status der Schalter bei Neustart fhem
Beitrag von: dev0 am 22 Februar 2017, 17:40:45
Lösch mal das eventMap Attribut, config speichern und neu FHEM neustarten. Ändert sich das Verhalten bzgl. "gpio" im Reading dann?
Titel: Antw:ESPEasy neues Modul: Status der Schalter bei Neustart fhem
Beitrag von: MichaelO am 22 Februar 2017, 18:26:00
Ja, jetzt passt die Anzeige. Das Reading status vom ESP wird zwar nicht neu eingelesen beim Neustart (der Zeitstempel zeigt die letzte Änderungszeit an), aber auch nicht "falsch" mit gpio überschrieben.

Dafür kann ich jetzt natürlich über die on/off-Buttons nichts mehr klickbar schalten.
Titel: Antw:ESPEasy neues Modul: Status der Schalter bei Neustart fhem
Beitrag von: dev0 am 22 Februar 2017, 18:47:41
Wenn die Readings ohne eventMap Attribut korrekt sind, dann würde ich auf ein Fehlverhalten von eventMap tippen. Frag mal den zuständigen Maintainer.

Um den aktuellen Status nach einem Neustart zu erhalten kannst auf global:INITIALIZED triggern und einen statusrequest in Verbindung mit dem pollGPIOs Attribut ausführen oder den ESP aktiv den Status alle x Sekunden senden lassen.
Titel: Antw:ESPEasy neues Modul: Status der Schalter bei Neustart fhem
Beitrag von: MichaelO am 23 Februar 2017, 08:33:05
Zitat von: dev0 am 22 Februar 2017, 18:47:41
Um den aktuellen Status nach einem Neustart zu erhalten kannst auf global:INITIALIZED triggern und einen statusrequest in Verbindung mit dem pollGPIOs Attribut ausführen oder den ESP aktiv den Status alle x Sekunden senden lassen.

Die Lösung scheint nur teilweise eine "vernünftige" zu sein. Wenn ich das richtig sehe, fragt fhem mit Setzen von pollGPIOs im Intervall des Attributs Intervall nun regelmäßig die GPIO ab. Das will ich aber eigentlich nicht. Ein größeres Problem ist aber, dass pollGPIOs neue Readings anlegt.

Normalerweise existiert in fhem im Device eines Switches ein Reading mit dem Namen, den man in ESPEasy unter "Values" vergeben hat (bei mir status). Sobald ich manuell oder per Kommando schalte, ändert sich das ESP-Value-Reading. Fragt nun pollGPIOs die Pins ab, dann steht der Status im Reading "GPIO<Nummer des GPIO>". Dummerweise ändern sich diese Readings aber nicht beim Schalten des Devices, dann ändert sich nämlich das ESP-Value-Reading. Somit kann ich kein stateFormat formulieren, wenn der Zustand der Pins in zwei Readings auftauchen kann.

Beim Neustart steht in meinem Reading "status" leider nicht on/off, sondern "gpio", deswegen schreibt stateFormat das bei mir so in STATE und zack... passt die Anzeige und vor allem meine DOIF nicht mehr.

relevante Teile des Listings nach Neustart:

Internals:
   Internals:
   ...
   Readings:
     2017-02-23 08:18:40   GPIO14          off
     2017-02-23 08:18:40   GPIO14_mode     output
     2017-02-23 08:18:40   state           GPI: off
     2017-02-23 08:10:08   status          gpio
   Helper:
     Intat:
       1:
         FN         ESPEasy_statusRequest
         INTERVAL   305
         TRIGGERTIME 23.02.2017 08:23:45
     Received:
       GPIO14     1487834320.85035
       GPIO14_mode 1487834320.8487
Attributes:
   IODev      ESPEasyBridge
   Interval   300
   comment    Relais 2 = GPIO 14
   eventMap   /gpio 14 on:on/gpio 14 off:off
   group      ESPEasy Device
   pollGPIOs  14
   presenceCheck 0
   readingSwitchText 1
   room       3.7_Aussen
   setState   3
   stateFormat status
   webCmd     on:off


Und so, nachdem ich manuell geschaltet habe, nun sind beide Readings desselben Pins asynchron:

Internals:
   Internals:
   ...
   Readings:
     2017-02-23 08:23:45   GPIO14          off
     2017-02-23 08:23:45   GPIO14_mode     output
     2017-02-23 08:25:40   state           GPI: off sta: on
     2017-02-23 08:25:40   status          on
   Helper:
     Intat:
       1:
         FN         ESPEasy_statusRequest
         INTERVAL   300
         TRIGGERTIME 23.02.2017 08:28:45
     Received:
       GPIO14     1487834625.08844
       GPIO14_mode 1487834625.08662
       status     1487834740.53256
Attributes:
   IODev      ESPEasyBridge
   Interval   300
   comment    Relais 2 = GPIO 14
   eventMap   /gpio 14 on:on/gpio 14 off:off
   group      ESPEasy Device
   pollGPIOs  14
   presenceCheck 0
   readingSwitchText 1
   room       3.7_Aussen
   setState   3
   stateFormat status
   webCmd     on:off


Irgendwie müssten die Readings GPIO<> und ESP-Value-Reading übereinander gebracht werden. Es ist klar, dass das Modul nicht weiß, welches Value-Reading im Falle eines Switches zu welchem GPIO gehört, aber vielleicht kann man das als Attribut setzen? Dann sollten durch pollGPIOs keine neuen Readings GPIO<> erzeugt werden, sondern ein direktes Mapping auf die ESP-Value-Readings erfolgen.

Ggf. wäre es dann auch eine Idee, dass erste Abfragen nach Initialize ganze als Attribut zu definieren, um sich das Triggern und DOIF oder at zu sparen? So etwas wie "pollGPIOsOnInitialize" in Verbindung mit dem Attribut "pollGPIOs" und "Intervall=0"? Dann bliebe die Funktionalität innerhalb des Moduls und man benötigt keine zusätzlichen DOIF.

Gruß
Michael
Titel: Antw:ESPEasy neues Modul: Status der Schalter bei Neustart fhem
Beitrag von: dev0 am 23 Februar 2017, 10:02:21
Zitat von: MichaelO am 23 Februar 2017, 08:33:05
ann steht der Status im Reading "GPIO<Nummer des GPIO>".
Der Ausdruck GPIO läßt sich über ein Attribut einstellen. Sonst pass auf ESP Seiten den Value Name an, dass es synchron wird.

Zitat
Beim Neustart steht in meinem Reading "status" leider nicht on/off, sondern "gpio"
Das hatten wird doch schon: das ist ein Seiteneffekt der durch eventMap hevorgerufen wird. Ob das an einer falschen eventMap Syntax oder ein Fehlverhalten von eventMap ist, weiß ich nicht, es läßt sich aber mit einem Dummy nachstellen. Es ist also kein Problem des ESPEasy Moduls und ich bin raus.

define d dummy
attr d eventMap /gpio 14 on:on/gpio 14 off:off/
list d
Internals:
   .eventMapCmd on:noArg off:noArg
   CFGFN     
   NAME       d
   NR         24140
   STATE      ???
   TYPE       dummy
Attributes:
   eventMap   /gpio 14 on:on/gpio 14 off:off/

set d on
list d
Internals:
   .eventMapCmd on:noArg off:noArg
   CFGFN     
   NAME       d
   NR         24140
   STATE      on
   TYPE       dummy
   Readings:
     2017-02-23 09:32:48   state           gpio 14 on
Attributes:
   eventMap   /gpio 14 on:on/gpio 14 off:off/

save
Wrote configuration to /opt/fhem-dev/fhem-dev.cfg
shutdown restart

list d
Internals:
   .eventMapCmd on:noArg off:noArg
   NAME       d
   NR         169
   STATE      on
   TYPE       dummy
   Readings:
     2017-02-23 09:32:48   state           gpio
Attributes:
   eventMap   /gpio 14 on:on/gpio 14 off:off/


Zitat
Ggf. wäre es dann auch eine Idee, dass erste Abfragen nach Initialize ganze als Attribut zu definieren, um sich das Triggern und DOIF oder at zu sparen? So etwas wie "pollGPIOsOnInitialize" in Verbindung mit dem Attribut "pollGPIOs" und "Intervall=0"? Dann bliebe die Funktionalität innerhalb des Moduls und man benötigt keine zusätzlichen DOIF.

Am liebsten würde ich das ganze Pollen aus dem Modul rausschmeißen, da das nur ein Workaround für Unzulänglichkeiten von ESPEasy bzw. von ESPEasy Plugins ist. Es gibt zZ keine Möglichkeit einen statusRequest anzustoßen, der die aktuellen Werte über den offiziellen Weg schickt. Ich werte beim pollen die JSON Response aus, diese enthält aber nicht die vollständigen Informationen... Der korrekte Weg wäre das in ESPEasy zu implementieren. Hast Du Lust dazu?

Fazit: Das Einfachste ist, wenn Du vom ESP die Werte alle xx Sekunden senden läßt. Der falsche Wert (gpio) hat nichts mit dem ESPEasy Modul zu tun, wende Dich dazu an den Maintainer.
Titel: Antw:ESPEasy neues Modul: Status der Schalter bei Neustart fhem
Beitrag von: MichaelO am 23 Februar 2017, 10:50:33
Sorry, dass ich den Threat eröffnet habe. Ich dachte, man könne ggf. Verbesserungen am Modul anstoßen, die auch anderen Nutzern das Leben erleichtert.

ZitatAm liebsten würde ich das ganze Pollen aus dem Modul rausschmeißen, da das nur ein Workaround für Unzulänglichkeiten von ESPEasy bzw. von ESPEasy Plugins ist. Es gibt zZ keine Möglichkeit einen statusRequest anzustoßen, der die aktuellen Werte über den offiziellen Weg schickt. Ich werte beim pollen die JSON Response aus, diese enthält aber nicht die vollständigen Informationen... Der korrekte Weg wäre das in ESPEasy zu implementieren. Hast Du Lust dazu?

Wenn ich das mal eben könnte, dann würde ich es implementieren. Nun weiß ich, dass es so nicht geht und werde einen Weg suchen.

Trotzdem danke für die Mühe bislang.
Gruß
Michael
Titel: Antw:ESPEasy neues Modul: Status der Schalter bei Neustart fhem
Beitrag von: dev0 am 23 Februar 2017, 11:55:08
Zitat von: MichaelO am 23 Februar 2017, 10:50:33
Sorry, dass ich den Threat eröffnet habe.

Kein Problem. Nur gut, dass ich trotzdem helfen konnte ohne dass Du es bemerkt hast.
Titel: Antw:ESPEasy neues Modul: Status der Schalter bei Neustart fhem
Beitrag von: Pf@nne am 23 Februar 2017, 12:56:35
Zitat von: dev0 am 22 Februar 2017, 18:47:41
Um den aktuellen Status nach einem Neustart zu erhalten kannst auf global:INITIALIZED triggern und einen statusrequest.......

Ich würde auch gerne alle ESP-Devices nach einem FHEM-Neustart einmal anfragen....
Hast du ein Beispiel für mich, wie man das Ereignis global:INITIALIZED abfragt?

Gruß
Pf@nne
Titel: Antw:ESPEasy neues Modul: Status der Schalter bei Neustart fhem
Beitrag von: MichaelO am 23 Februar 2017, 13:14:57
ZitatHast du ein Beispiel für mich, wie man das Ereignis global:INITIALIZED abfragt?

So kann es gehen...

DOIF (["^global$:MODIFIED $SELF$"])

    (mache Dinge nach Initialize)


Gruß
Michael
Titel: Antw:ESPEasy neues Modul: Status der Schalter bei Neustart fhem
Beitrag von: Pf@nne am 23 Februar 2017, 17:34:07
Moin,

so richtig will das noch nicht....
define fhemINITIALIZED DOIF (["^global$:MODIFIED $SELF$"]) (fhem("set ade write HelloWorld"))
attr fhemINITIALIZED room _System


Das set ist ein MQTT-publish, vieleicht ist FHEM zu diesem Zeitpunkt noch garnicht mit dem Broker verbunden?
Das set ansich funktioniert....
define INIT dummy
attr INIT room _System
attr INIT setList on off
attr INIT webCmd on:off

define nf_INIT notify INIT { \
    if($EVENT eq "on") {\
      fhem("set ade write HelloWorld");;\
}\
}
attr nf_INIT room _System
Titel: Antw:ESPEasy neues Modul: Status der Schalter bei Neustart fhem
Beitrag von: MichaelO am 23 Februar 2017, 17:50:51
Deine Vermutung könnte stimmen. Dann trigger doch auf die Verbindung mit dem Broker... gibt es da irgendein Event? Ich hab keinen Broker laufen.

Darüber hinaus kannst Du das Kommando set... direkt schreiben, ohne 'fhem':

(set ade write HelloWorld)

Was sagt denn das Logfile an der Stelle?
Titel: Antw:ESPEasy neues Modul: Status der Schalter bei Neustart fhem
Beitrag von: Pf@nne am 23 Februar 2017, 18:02:56
Der MQTT-Broker meldet die Verbinding zurück:
2017-02-23 17:59:52 MQTT MQTT_Broker connection: active

Aber es funktioniert auch mit einem einfachen Dummy nicht...
define fhemINITIALIZED DOIF (["^global$:MODIFIED $SELF$"]) (set INIT on)
attr fhemINITIALIZED room _System

define INIT dummy
attr INIT room _System
attr INIT setList on off
attr INIT webCmd on:off


Hier sollte doch der Dummy INIT nach dem Neustart auf on stehen?

Titel: Antw:ESPEasy neues Modul: Status der Schalter bei Neustart fhem
Beitrag von: dev0 am 23 Februar 2017, 18:16:48
@Pf@nne: Du mußt auf global:INITIALIZED triggern, nicht auf MODIFIED:

define nf notify global:INITIALIZED {Log 1, 'Hello Pf@nne'}
Titel: Antw:ESPEasy neues Modul: Status der Schalter bei Neustart fhem
Beitrag von: MichaelO am 23 Februar 2017, 18:20:56
versuche mal

define fhemINITIALIZED DOIF ([MQTT:"active"]) (set INIT on)


Das sollte triggern, sobald das Gerät MQTT ein Event auslöst, in dem "active" vorkommt.
Titel: Antw:ESPEasy neues Modul: Status der Schalter bei Neustart fhem
Beitrag von: Pf@nne am 23 Februar 2017, 20:19:27
Moin,

define fhemINITIALIZED notify global:INITIALIZED { \
      fhem("set ADE_Relay getStatus Relay");;\
}
attr fhemINITIALIZED room _System


Läuft einwandfrei.... Danke euch!
Die Verbinding zum MQTT-Broker ist zu diesem Zeitpunkt auch schon da!

Nur der "upzudatende" MQTT_DEVICE selber ist zu diesem Zeitpunkt noch nicht bereit.
Das Topic mit dem aktuellen state vom ESP8266-Device kommt zu schnell rein.
Ich habe jetzt auf der Device-Seite das publish des states um 2 Sekunden verzögert.

Das ist natürlich nicht ganz sauber, habt ihr noch eine Idee wie man das Problem auf der FHEM-Seite "umschiffen" könnte?
Ich könnte sonst auch die FHEM-Anfrage verzögert senden, mit sleep steht ja aber auch alles, oder?

Gruß
Pf@nne

Titel: Antw:ESPEasy neues Modul: Status der Schalter bei Neustart fhem
Beitrag von: dev0 am 23 Februar 2017, 20:50:58
Ich empfinde das nicht als unsauber und würde es so lassen. Alternativ mußt du halt prüfen ob das Device bereit ist, wenn nicht dann alle x Sekunden wieder prüfen...
Titel: Antw:ESPEasy neues Modul: Status der Schalter bei Neustart fhem
Beitrag von: Pf@nne am 23 Februar 2017, 21:17:33
Dann bleibt es so....Danke!