GPIO über i2c interrupt triggern und Inputs in FHEM immer aktuell anzeigen

Begonnen von f.f, 03 September 2017, 12:01:04

Vorheriges Thema - Nächstes Thema

klausw

Du musst den GPIO nicht zurückstellen.
Der wird immer auf off stehen.
Bei jeder fallenden Flanke wird der Counter eins hochzählen und Toggle toggeln.
Außerdem wird sich der Zeitstempel von state aktualisieren (sofern kein event-on-... existiert)
Die GPIO Definition ist korrekt.
Den MCP kannst du auch bedienen vermute ich? Wenn ja dann ist der auch korrekt definiert.


Ich hätte mir dein notify anschauen sollen... du allerdings auch meine Erläuterungen lesen 8)

Interrupt Ablauf:
Taste drücken
-> Spannung am Input Port des MCP23008 wechselt
-> INT wird auf GND gezogen und bleibt da
-> GPIO EXCEPT Routine wird ausgelöst
-> auslesen des GPIO, aktualisieren der Readings (state bleibt immer of, da nur bei fallender Flanke ein Interrupt ausgelesen wird und nach einer fallenden Flanke der GPIO 0 ist)
     und auslösen der ReadingEvents

von hier an geht es zu Fuß weiter:

----------------

dein notify müsste jetzt mit "get MCP23008" den MCP23008 auslesen. Damit werden erst die Readings aktualisiert und auch der Interrupt Pin zurück gesetzt (solange du nicht ausliest kann kein weiterer Interrupt erzeugt werden)

Damit solltest du erst einmal den Pinstatus vin A0 bis A2 live im FHEM sehen.

versuche es erst mal bis hierhin

----------------

Um die Ausgänge zu setzten würde ich ein weiteres notify anlegen, welches auf A0 bis A2 reagiert.
Wenn du A4-A6 mithilfe von readingsproxy in ein separates Device überführst kannst du dort sogar direkt set <name> toggle verwenden.
RasPi B v2 mit FHEM 18B20 über 1Wire, LED PWM Treiber über I2C, Luchtdruck-, Feuchtesensor und ein paar Schalter/LED\'s zum testen
Module: RPI_GPIO, RPII2C, I2C_EEPROM, I2C_MCP23008, I2C_MCP23017, I2C_MCP342x, I2C_PCA9532, I2C_PCF8574, I2C_SHT21, I2C_BME280

jorge

ZitatInterrupt Ablauf:
Taste drücken
-> Spannung am Input Port des MCP23008 wechselt
-> INT wird auf GND gezogen und bleibt da
-> GPIO EXCEPT Routine wird ausgelöst
-> auslesen des GPIO, aktualisieren der Readings (state bleibt immer of, da nur bei fallender Flanke ein Interrupt ausgelesen wird und nach einer fallenden Flanke der GPIO 0 ist)
     und auslösen der ReadingEvents

Das hab ich nun geschnallt und folgendes Notify definiert:

Internals:
   DEF        GPIO18:.* get MCP23008
   NAME       MCP23008.Input.Interrupt
   NOTIFYDEV  GPIO18
   NR         39
   NTFY_ORDER 50-MCP23008.Input.Interrupt
   REGEXP     GPIO18:.*
   STATE      2018-06-27 15:54:43
   TYPE       notify
   Readings:
     2018-06-27 15:36:59   state           active
Attributes:
   comment    IF ([MCP23008:PortA5] eq "off")(set MCP23008 PortA5 on) ELSE (set MCP23008 PortA5 off)
   room       I2C


Nun werden zwei events ausgelöst: einmal beim Drücken des Tasters und einmal beim Loslassen.

Bin dann Deinem Vorschlag gefolgt und habe ein readingsProxy definiert (Danke für den Hinweis):

Internals:
   CFGFN
   DEF        MCP23008:PortA5
   DEVICE     MCP23008
   NAME       MCP23008.PortA5
   NOTIFYDEV  MCP23008,global
   NR         3487
   NTFY_ORDER 50-MCP23004.Port5
   READING    PortA5
   STATE      off
   TYPE       readingsProxy
   Content:
     MCP23008   1
   Readings:
     2018-06-27 15:58:28   lastCmd         off
     2018-06-27 15:58:28   state           off
Attributes:
   room       I2C
   setFn      {($CMD eq "on")?"PortA5 on":"PortA5 off"}
   setList    on off


Damit funktioniert das toggeln an A5.

Um nun die Output nach A5 zu schicken, habe ich folgendes DOIF definiert:

Internals:
   CFGFN
   DEF        ([MCP23008:PortA5] eq "on")
(set MCP23008.PortA5 toggle)
   NAME       MCP23008.PortA1.DOIF
   NR         1378
   NTFY_ORDER 50-MCP23008.PortA1.DOIF
   STATE      initialized
   TYPE       DOIF
   Readings:
     2018-06-27 16:00:09   cmd             0
     2018-06-27 16:00:09   state           initialized
   Condition:
     0          ReadingValDoIf($hash,'MCP23008','PortA5') eq "on"
   Devices:
     0           MCP23008
     all         MCP23008
   Do:
     0:
       0          set MCP23008.PortA5 toggle
     1:
   Helper:
     globalinit 1
     last_timer 0
     sleeptimer -1
   Itimer:
   Readings:
     0           MCP23008:PortA5
     all         MCP23008:PortA5
   Regexp:
     All:
   State:
Attributes:
   room       I2C
 

Scheinbar wird durch das Schreiben auf A5 nochmal ein Interrrupt ausgelöst, jedenfalls zeigt das der Eventmonitor. A5 wird dadurch offensichtlich gleich zweimal getoggelt, jedenfalls ändert sich die Signalisierung an A5 nicht.

Irgendwie glaub ich, ich bin auf dem falsche Trip... jedenfalls find ich keine Lösung.

LG
Jorge

FHEM.RaspberryPi 2 (HM, 1Wire, Callmonitor.FB 7490, GPIO, I2C, MQTT-Server, MCP23018)
FHEM.RaspberryPi  (FHEM2FHEM, CUL, FS20)
FHEM.RPiZeroW (I2C, 1Wire, python.api, XiaomiBTLESens.MQTT)
FHEM.Win7 (FHEM2FHEM,DBLOG.MySql)
ESPEasy (WEMOSD1, I2C, Analog, 1Wire), Sonoff_T1_3ch, Mobotix QM25, robonect

klausw

Zitat von: jorge am 27 Juni 2018, 16:22:53
Das hab ich nun geschnallt und folgendes Notify definiert:
...
Nun werden zwei events ausgelöst: einmal beim Drücken des Tasters und einmal beim Loslassen.

Das passt, bei jeder Änderung an Pins die beim MCP23008 im Attribut Interrupt stehen, wird ein Interrupt ausgelöst.

Zitat von: jorge am 27 Juni 2018, 16:22:53
Bin dann Deinem Vorschlag gefolgt und habe ein readingsProxy definiert (Danke für den Hinweis):
...
Damit funktioniert das toggeln an A5.

sehr schön
damit ist dieser Punkt schon einmal erledigt.
Das Attribut setFn kannst du auch wie folgt umsetzen:
attr MCP23008.PortA5 setFn {$READING . " " .$CMD}

Zitat von: jorge am 27 Juni 2018, 16:22:53


Um nun die Output nach A5 zu schicken, habe ich folgendes DOIF definiert:
...

Scheinbar wird durch das Schreiben auf A5 nochmal ein Interrrupt ausgelöst, jedenfalls zeigt das der Eventmonitor. A5 wird dadurch offensichtlich gleich zweimal getoggelt, jedenfalls ändert sich die Signalisierung an A5 nicht.

Irgendwie glaub ich, ich bin auf dem falsche Trip... jedenfalls find ich keine Lösung.


wird wirklich ein Interrupt ausgelöst? Also zeigt der Eventmonitor den GPIO?
beim setzen eines Ports am MCP werden danach glaube ich alle Ports nochmal neu abgefragt.
Das könnte zu den Events (aber nur vom MCP) führen.

it DOIF kenne ich mich nicht aus, ich nutze stattdessen notify

Allerdings kann ich nicht erkennen das du in deinem DOIF auf A1 reagierst.
Letztendlich könntest du sowas basteln:
attr eventonchangereading vom MCP auf .* setzen
bei einem Wechsel am MCP Port A1 von 0 auf 1 den Port A5 toggeln

Vermutlich musst du nur den A1 noch in dein DOIF bringen.
RasPi B v2 mit FHEM 18B20 über 1Wire, LED PWM Treiber über I2C, Luchtdruck-, Feuchtesensor und ein paar Schalter/LED\'s zum testen
Module: RPI_GPIO, RPII2C, I2C_EEPROM, I2C_MCP23008, I2C_MCP23017, I2C_MCP342x, I2C_PCA9532, I2C_PCF8574, I2C_SHT21, I2C_BME280