Problem mit I2C_PCF8574 input - direkt am raspi geht es, aber nicht über firmata

Begonnen von audimax, 03 März 2019, 20:52:12

Vorheriges Thema - Nächstes Thema

audimax

Hallo zusammen,

ich hoffe ich stelle diese Frage ins richtige Unterforum.
Die Suche hat ein paar Beiträge zu I2C_PCF8574 ergeben, aber nichts was auf mein Problem passt.

Ich würde gerne in meinem Schaltschrank i2c GPIO Karten betreiben. Um nicht an einen Raspberry Pi gebunden zu sein will ich das ganze gerne per ethernet an fhem anbinden. Als Möglichkeit kam mir hierbei die Lösung mit einem Arduino +Ethernet und Firmata unter.

Was alles problemlos funktioniert:
- Arduino inputs per frm_input lesen
- pcf8574 Ports schreiben über I2C_PCF8574 und FRM als IODev
- I2C_PCF8574 inputs über den onboard I2C eines Raspberry Pi

Was nicht funktioniert:
- I2C_PCF8574 als Input mit FRM als IODev

Im Moment habe einen Testaufbau hier mit zwei identischen I2C Karten und identischer Konfiguration, wobei eine direkt am Bus angeschlossen ist und die andere über den Arduino dran hängt.
Hier die config:
attr global userattr cmdIcon devStateIcon:textField-long devStateStyle icon sortby webCmd webCmdLabel:textField-long widgetOverride
attr global autoload_undefined_devices 1
attr global logfile ./log/fhem-%Y-%m.log
attr global modpath .
attr global motd SecurityCheck:\
  WEB is not password protected\
\
Protect this FHEM installation by defining an allowed device with define allowed allowed\
You can disable this message with attr global motd none
attr global statefile ./log/fhem.save
attr global verbose 3

define WEB FHEMWEB 8083 global
setuuid WEB 5c7c2403-f33f-42d7-e125-27a9b3a32076c5aa

# Fake FileLog entry, to access the fhem log from FHEMWEB
define Logfile FileLog ./log/fhem-%Y-%m.log fakelog
setuuid Logfile 5c7c2405-f33f-42d7-c274-d5a315aced52e492

define autocreate autocreate
setuuid autocreate 5c7c2406-f33f-42d7-7bf2-90cbc4617d7c82e9
attr autocreate filelog ./log/%NAME-%Y.log

define eventTypes eventTypes ./log/eventTypes.txt
setuuid eventTypes 5c7c2406-f33f-42d7-6f71-c824be9b5f93811a

# Disable this to avoid looking for new USB devices on startup
define initialUsbCheck notify global:INITIALIZED usb create
setuuid initialUsbCheck 5c7c2406-f33f-42d7-ea07-5908cc1e33ea4bfa
define myI2C RPII2C 1
setuuid myI2C 5c7c2446-f33f-42d7-ef4a-9f78683ab8ae19a8
attr myI2C room i2c
attr myI2C verbose 5


define modulE38direkt I2C_PCF8574 0x38
setuuid modulE38direkt 5c7c2df0-f33f-42d7-fc1a-f9046cd62eae893f
attr modulE38direkt IODev myI2C
attr modulE38direkt InputPorts 0,1,2,3,4,5,6,7
attr modulE38direkt OnStartup 0=on,1=on,2=on,3=on,4=on,5=on,6=on,7=on
attr modulE38direkt event-on-change-reading state,Port0,Port1,Port2,Port3,Port4,Port5,Port6,Port7
attr modulE38direkt poll_interval 0.1
attr modulE38direkt room i2c
attr modulE38direkt verbose 5
define frmarduino FRM 3030 global
setuuid frmarduino 5c7c2df0-f33f-42d7-30e5-9c03e11cf5bd0b36
attr frmarduino verbose 5


define modulE38frm I2C_PCF8574 0x38
setuuid modulE38frm 5c7c2df1-f33f-42d7-fc52-6929623a79422ac3
attr modulE38frm IODev frmarduino
attr modulE38frm InputPorts 0,1,2,3,4,5,6,7
attr modulE38frm OnStartup 0=on,1=on,2=on,3=on,4=on,5=on,6=on,7=on
attr modulE38frm event-on-change-reading state,Port0,Port1,Port2,Port3,Port4,Port5,Port6,Port7
attr modulE38frm poll_interval 0.1
attr modulE38frm room i2c
attr modulE38frm verbose 5


und das Logfile dazu:
2019.03.03 19:46:06 1: Including fhem.cfg
2019.03.03 19:46:09 3: WEB: port 8083 opened
2019.03.03 19:46:09 2: eventTypes: loaded 42 events from ./log/eventTypes.txt
2019.03.03 19:46:11 1: Including ./log/fhem.save
2019.03.03 19:46:11 4: modulE38direkt: STATE kann auf 255 wiederhergestellt werden 2019-03-03 19:46:11
2019.03.03 19:46:11 4: modulE38direkt: Port0 kann auf on wiederhergestellt werden 2019-03-03 19:29:22
2019.03.03 19:46:11 5: modulE38direkt: Port0 ist Eingang
2019.03.03 19:46:11 4: modulE38direkt: Port1 kann auf on wiederhergestellt werden 2019-03-03 19:42:57
2019.03.03 19:46:11 5: modulE38direkt: Port1 ist Eingang
2019.03.03 19:46:11 4: modulE38direkt: Port2 kann auf on wiederhergestellt werden 2019-03-03 19:42:46
2019.03.03 19:46:11 5: modulE38direkt: Port2 ist Eingang
2019.03.03 19:46:11 4: modulE38direkt: Port3 kann auf on wiederhergestellt werden 2019-03-03 19:25:47
2019.03.03 19:46:11 5: modulE38direkt: Port3 ist Eingang
2019.03.03 19:46:11 4: modulE38direkt: Port4 kann auf on wiederhergestellt werden 2019-03-03 19:29:27
2019.03.03 19:46:11 5: modulE38direkt: Port4 ist Eingang
2019.03.03 19:46:11 4: modulE38direkt: Port5 kann auf on wiederhergestellt werden 2019-03-03 19:42:54
2019.03.03 19:46:11 5: modulE38direkt: Port5 ist Eingang
2019.03.03 19:46:11 4: modulE38direkt: Port6 kann auf on wiederhergestellt werden 2019-03-03 19:25:47
2019.03.03 19:46:11 5: modulE38direkt: Port6 ist Eingang
2019.03.03 19:46:11 4: modulE38direkt: Port7 kann auf on wiederhergestellt werden 2019-03-03 19:25:47
2019.03.03 19:46:11 5: modulE38direkt: Port7 ist Eingang
2019.03.03 19:46:11 4: modulE38direkt: state kann auf 255 wiederhergestellt werden 2019-03-03 19:45:30
2019.03.03 19:46:11 3: frmarduino: port 3030 opened
2019.03.03 19:46:11 1: usb create starting
2019.03.03 19:46:13 3: Probing ZWDongle device /dev/serial0
2019.03.03 19:46:13 1: ZWDongle: Can't open /dev/serial0: Permission denied
2019.03.03 19:46:14 3: Probing CUL device /dev/ttyAMA0
2019.03.03 19:46:14 1: CUL: Can't open /dev/ttyAMA0: Permission denied
2019.03.03 19:46:14 1: usb create end
2019.03.03 19:46:14 5: im init client fuer modulE38direkt
2019.03.03 19:46:14 5: modulE38direkt Output:  0b11111111
2019.03.03 19:46:14 5: modulE38direkt Inverts: 0b00000000
2019.03.03 19:46:14 5: modulE38direkt Inputs:  0b11111111
2019.03.03 19:46:14 5: modulE38direkt Result:  0b11111111
2019.03.03 19:46:14 5: myI2C: vom client empfangen|i2caddress: 56|data: 255|direction: i2cwrite
2019.03.03 19:46:14 5: myI2C: HWaccess I2CAddr: 0x38
2019.03.03 19:46:14 5: myI2C: vom client empfangen|i2caddress: 56|data: 255|direction: i2cwrite
2019.03.03 19:46:14 5: myI2C: HWaccess block schreiben,  Inh(dec):|255|, laenge: |1|
2019.03.03 19:46:14 5: myI2C ->Client gefunden: modulE38direkt, I2Caddress: 56 Data: 255
2019.03.03 19:46:14 0: Featurelevel: 5.9
2019.03.03 19:46:14 0: Server started with 10 defined entities (fhem.pl:18623/2019-02-17 perl:5.024001 os:linux user:fhem pid:1388)
2019.03.03 19:46:14 5: myI2C: vom client empfangen|direction: i2cread|i2caddress: 56
2019.03.03 19:46:14 5: myI2C: HWaccess I2CAddr: 0x38
2019.03.03 19:46:14 5: myI2C: vom client empfangen|direction: i2cread|i2caddress: 56
2019.03.03 19:46:14 5: myI2C ->Client gefunden: modulE38direkt, I2Caddress: 56 Gelesen: 247
2019.03.03 19:46:14 4: Connection accepted from frmarduino_192.168.42.41_1220
2019.03.03 19:46:14 5: frmarduino FRM_DoInit
2019.03.03 19:46:14 5: frmarduino FRM:>ff
2019.03.03 19:46:14 5: frmarduino setup stage 1
2019.03.03 19:46:14 5: frmarduino setup stage 1
2019.03.03 19:46:14 5: frmarduino setup stage 1
2019.03.03 19:46:14 5: frmarduino setup stage 1
2019.03.03 19:46:15 5: frmarduino setup stage 1
2019.03.03 19:46:15 5: frmarduino setup stage 1
2019.03.03 19:46:15 5: frmarduino setup stage 1
2019.03.03 19:46:15 5: frmarduino setup stage 1
2019.03.03 19:46:15 5: frmarduino setup stage 1
2019.03.03 19:46:15 5: frmarduino setup stage 1
2019.03.03 19:46:15 5: frmarduino setup stage 1
2019.03.03 19:46:16 5: frmarduino setup stage 1
2019.03.03 19:46:17 5: frmarduino setup stage 1
2019.03.03 19:46:17 3: frmarduino querying Firmata versions
2019.03.03 19:46:17 5: frmarduino FRM:>f90000
2019.03.03 19:46:17 5: frmarduino FRM:>f079f7
2019.03.03 19:46:17 5: frmarduino FRM:<f90206f079020a6900320063003200650074006800670065006e002e0069006e006f00f7
2019.03.03 19:46:17 5: frmarduino setup stage 1
2019.03.03 19:46:17 3: frmarduino Firmata Firmware Version: i2c2ethgen.ino V_2_10 (using Protocol Version: V_2_06)
2019.03.03 19:46:17 5: frmarduino FRM:>f069f7
2019.03.03 19:46:17 5: frmarduino FRM:>f06bf7
2019.03.03 19:46:17 5: frmarduino FRM:<f07155006e00680061006e0064006c0065006400200073007900730065007800200063006f006d006d0061006e006400f7f06c7f7f00010b017f00010b017f7f00010b017f00010b017f00010b017f00010b017f00010b017f7f7f7f7f00010b017f00010b017f00010b017f00010b017f00010b0106017f00010b0106017f7f7ff7
2019.03.03 19:46:17 3: received String_data: Unhandled sysex command
2019.03.03 19:46:17 5: frmarduino setup stage 2
2019.03.03 19:46:18 5: frmarduino setup stage 2
2019.03.03 19:46:19 5: frmarduino setup stage 2
2019.03.03 19:46:20 5: myI2C: vom client empfangen|i2caddress: 56|direction: i2cread
2019.03.03 19:46:20 5: myI2C: HWaccess I2CAddr: 0x38
2019.03.03 19:46:20 5: myI2C: vom client empfangen|i2caddress: 56|direction: i2cread
2019.03.03 19:46:20 5: myI2C ->Client gefunden: modulE38direkt, I2Caddress: 56 Gelesen: 251
2019.03.03 19:46:20 5: frmarduino setup stage 2
2019.03.03 19:46:21 5: frmarduino setup stage 2
2019.03.03 19:46:22 5: frmarduino setup stage 2
2019.03.03 19:46:22 5: frmarduino FRM:>f07a6807f7
2019.03.03 19:46:22 5: frmarduino setup stage 3
2019.03.03 19:46:22 5: frmarduino initializing 'modulE38frm'
2019.03.03 19:46:22 5: modulE38frm Output:  0b00000000
2019.03.03 19:46:22 5: modulE38frm Inverts: 0b00000000
2019.03.03 19:46:22 5: modulE38frm Inputs:  0b11111111
2019.03.03 19:46:22 5: modulE38frm Result:  0b11111111
2019.03.03 19:46:22 5: frmarduino FRM:>f07638007f01f7
2019.03.03 19:46:22 5: frmarduino FRM:>f07638080100f7
2019.03.03 19:46:22 5: frmarduino setup stage 5
2019.03.03 19:46:23 5: frmarduino FRM:<f077380000007f01f7
2019.03.03 19:46:26 5: myI2C: vom client empfangen|i2caddress: 56|direction: i2cread
2019.03.03 19:46:26 5: myI2C: HWaccess I2CAddr: 0x38
2019.03.03 19:46:26 5: myI2C: vom client empfangen|i2caddress: 56|direction: i2cread
2019.03.03 19:46:26 5: myI2C ->Client gefunden: modulE38direkt, I2Caddress: 56 Gelesen: 223
2019.03.03 19:46:26 5: frmarduino FRM:>f07638080100f7
2019.03.03 19:46:26 5: frmarduino FRM:<f077380000007f01f7
2019.03.03 19:46:32 5: myI2C: vom client empfangen|i2caddress: 56|direction: i2cread
2019.03.03 19:46:33 5: myI2C: HWaccess I2CAddr: 0x38
2019.03.03 19:46:33 5: myI2C: vom client empfangen|i2caddress: 56|direction: i2cread
2019.03.03 19:46:33 5: myI2C ->Client gefunden: modulE38direkt, I2Caddress: 56 Gelesen: 255
2019.03.03 19:46:33 5: frmarduino FRM:>f07638080100f7
2019.03.03 19:46:33 5: frmarduino FRM:<f077380000007701f7
2019.03.03 19:46:39 5: myI2C: vom client empfangen|i2caddress: 56|direction: i2cread
2019.03.03 19:46:39 5: myI2C: HWaccess I2CAddr: 0x38
2019.03.03 19:46:39 5: myI2C: vom client empfangen|i2caddress: 56|direction: i2cread
2019.03.03 19:46:39 5: myI2C ->Client gefunden: modulE38direkt, I2Caddress: 56 Gelesen: 255
2019.03.03 19:46:39 5: frmarduino FRM:>f07638080100f7
2019.03.03 19:46:39 5: frmarduino FRM:<f077380000007b01f7
2019.03.03 19:46:45 5: myI2C: vom client empfangen|i2caddress: 56|direction: i2cread
2019.03.03 19:46:45 5: myI2C: HWaccess I2CAddr: 0x38
2019.03.03 19:46:45 5: myI2C: vom client empfangen|i2caddress: 56|direction: i2cread
2019.03.03 19:46:45 5: myI2C ->Client gefunden: modulE38direkt, I2Caddress: 56 Gelesen: 255
2019.03.03 19:46:45 5: frmarduino FRM:>f07638080100f7
2019.03.03 19:46:45 5: frmarduino FRM:<f077380000007f01f7
2019.03.03 19:46:51 5: myI2C: vom client empfangen|i2caddress: 56|direction: i2cread
2019.03.03 19:46:51 5: myI2C: HWaccess I2CAddr: 0x38
2019.03.03 19:46:51 5: myI2C: vom client empfangen|i2caddress: 56|direction: i2cread
2019.03.03 19:46:51 5: myI2C ->Client gefunden: modulE38direkt, I2Caddress: 56 Gelesen: 255
2019.03.03 19:46:51 5: frmarduino FRM:>f07638080100f7
2019.03.03 19:46:51 5: frmarduino FRM:<f077380000007f01f7



Der Status vom frm Modul bleibt auf Initialized stehen.
Die Werte von frmarduino FRM: ändern sich, wenn ich einzelne Ports auf high lege.
Außerdem werden die Ports tatsächlich auf abgefragt, da der Interrupt des PCF 8574 auslöst und dann auch beim abfragen resettet wird.

Wo kann ich hier ansetzen?
Konfiguration?
Bug in einem Modul? Welchem?
Welche Daten kann ich noch liefern?

Danke an alle, die sich diesen, leider doch etwas längeren Thread, durchgelesen haben.
Viele Grüße
Max

klausw

Hallo Max,

so ganz kann ich dir noch nicht folgen.
Was passiert denn genau, wenn du PCF8574 als Input konfiguriert an den FRM anschließt?


als erstes würde ich den poll_interval löschen
alle 100ms einen I2C Lesebefehl auslösen könnte deine Systemlast empfindlich nach oben schrauben.
Für Outputs benötigst du die generell nicht. Schließlich haben die Ports den Wert, den du gesetzt hast.

Für Inputs würde ich über den Interrupt gehen.



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