Modul für die Ansteuerung des MCP23017 I2C Portextender

Begonnen von klausw, 03 Mai 2014, 01:02:40

Vorheriges Thema - Nächstes Thema

klausw

Hallo zusammen,

hier die neue Version des Moduls.

Die Initialisierung nach dem Hochfahren, sowie jede weitere (z.B. nach I2C Busunterbrechung) initialisiert sämtliche über die Attribute gesetzen Register.
Damit sollte der Output und auch der Interrupt endlich funktionieren.
Ich habe diesen neuen Thread angelegt, da der Andere ausschließlich für die GPIO's am Pi sein sollte.

besondere Attribute:
OutputPorts
Pullup
active_low
Interrupt


Die Werte für die Attribute müssen Kommagetrennte Portbezeichnungen sein.
z.B A1,B4,B7

Bitte Intensiv testen  8)
Wenn es rund läuft werde ich es einchecken.
!!!neuste Version hier und im SVN!!!
bei Problemen ist eine ältere funktionierende Version in Post 24!!!


Grüße
Klaus
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

linusd

#1
Hallo zusammen,

und von mir eine Beispielkonfiguration die bei mir im Testbetrieb funktioniert.
Ich habe hier 4 REED-Kontakte abgebildet, da dies auch eine der Einsatzbereich sein wird.
Getestet habe ich erfolgreich mit dieser Konfiguration jedoch auch Abstandsmesser, Regensensoren (auf digital gestellt) und Bewegungssensoren.

Optimierungsvorschläge (in besondere bei den Notify'er) sind selbstverständlich wilkommen!
 

###I2C-Device###
define chip RPII2C 1

###MCP23017-0x20###
define testMCP23017 I2C_MCP23017 0x20
attr testMCP23017 IODev chip
attr testMCP23017 Interrupt A0,A1
attr testMCP23017 Pullup A0,A1

###Interrupt A&B####
define INTA RPI_GPIO 4
attr INTA active_low yes
attr INTA direction input
attr INTA interrupt both

define INTB RPI_GPIO 17
attr INTB active_low yes
attr INTB direction input
attr INTB interrupt both

###Dummy- z.B.REED-Kontakte####

#--Bank-A--#
define dummyMCP23017_A0 dummy
define dummyMCP23017_A1 dummy

#--Bank-B--#
define dummyMCP23017_B0 dummy
define dummyMCP23017_B1 dummy

###Notify####

define notifyINTA notify INTA {my $A0state=ReadingsVal("testMCP23017","PortA0",0);; \
fhem ("set dummyMCP23017_A0 $A0state");;\
my $A1state=ReadingsVal("testMCP23017","PortA1",0);; \
fhem ("set dummyMCP23017_A1 $A1state");;\
fhem ("get testMCP23017 PortA0")}

define notifyINTB notify INTB {my $B0state=ReadingsVal("testMCP23017","PortB0",0);; \
fhem ("set dummyMCP23017_B0 $B0state");;\
my $B1state=ReadingsVal("testMCP23017","PortB1",0);; \
fhem ("set dummyMCP23017_B1 $B1state");;\
fhem ("get testMCP23017 PortB0")}


Dank Dir nochmal für das Modul Klaus!

Im Post 40 ist eine aktuelle Version der Konfiguration mit ausführlicher Beschreibung.

Gruß
Christian

IPPhoner2b

Ich danke euch beiden für die klasse Arbeit, kann es zwar jetzt erstmal nicht testen, weil mein Rechner für nen Bekannten auseinander genommen wurde, und nächste Woche bin ich auch nicht da, aber danach wirds mit großen Schritten weiter gehen  ::) ;D

Gruß
Christian

hajo23

Auch von mir hezlichen Dank! Initialisieren funktioniert jetzt, allerdings habe ich immer noch ein Problem. Der Status eines Ports wird nach "poweroff" nicht wieder hergestellt. Auch wird z.B. ein "set mcp_20 PortA0 on" in der fhem.cfg nicht ausgeführt.

Im log steht:
2014.05.03 18:13:37 3: mcp_20: failurei in message from chip
2014.05.03 18:13:37 3: Direction: i2cwrite I2Caddress: 32 Register: 0 Data: 0 received: undef
2014.05.03 18:13:37 3: mcp_20: failurei in message from chip
2014.05.03 18:13:37 3: Direction: i2cwrite I2Caddress: 32 Register: 1 Data: 0 received: undef

Am liebsten würde ich gern definieren, ob ein Port nach "poweroff" einen bestimmten Status haben soll, oder ob der letzte Status (vor poweroff) wieder hergestellt werden soll. :-)

Viele Grüße,
Hajo

klausw

Zitat von: hajo23 am 03 Mai 2014, 18:29:22
Auch von mir hezlichen Dank! Initialisieren funktioniert jetzt, allerdings habe ich immer noch ein Problem. Der Status eines Ports wird nach "poweroff" nicht wieder hergestellt. Auch wird z.B. ein "set mcp_20 PortA0 on" in der fhem.cfg nicht ausgeführt.

Im log steht:
2014.05.03 18:13:37 3: mcp_20: failurei in message from chip
2014.05.03 18:13:37 3: Direction: i2cwrite I2Caddress: 32 Register: 0 Data: 0 received: undef
2014.05.03 18:13:37 3: mcp_20: failurei in message from chip
2014.05.03 18:13:37 3: Direction: i2cwrite I2Caddress: 32 Register: 1 Data: 0 received: undef

Am liebsten würde ich gern definieren, ob ein Port nach "poweroff" einen bestimmten Status haben soll, oder ob der letzte Status (vor poweroff) wieder hergestellt werden soll. :-)

Viele Grüße,
Hajo
Das war zu befürchten, das jetzt die Wünsche kommen  8)

Set in der fhem.cfg wird nicht gehen, da erstmal alles initialisiert werden muss.
...ich schau mir das bei Gelegenheit mal an
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

hajo23

Hallo Klaus,

hat keine Eile. ich hatte gehofft, dass etwas in der Art

define Relais0_laststate notify mcp20:Initialized set Relais0 {ReadingsVal("Relais0","state","on")}

funktioniert. Vorerst habe ich mein Problem mit dem "definierten Status" in /etc/init.d/fhem gelöst:

i2cset -y 1 0x20 0x14 0xFF
i2cset -y 1 0x20 0x00 0x00

damit werden die Register zuerst auf high gesetzt und dann die bank auf Output gestellt.  Somit bleiben meine Lastrelais nach einem poweroff durchgehend ausgeschaltet, was mir wichtig ist.  ;)

klausw

Zitat von: hajo23 am 04 Mai 2014, 23:06:19
hat keine Eile. ich hatte gehofft, dass etwas in der Art

define Relais0_laststate notify mcp20:Initialized set Relais0 {ReadingsVal("Relais0","state","on")}

funktioniert. Vorerst habe ich mein Problem mit dem "definierten Status" in /etc/init.d/fhem gelöst:
ist mir zu kompliziert ... vielleicht liegt es an der Uhrzeit ;)

wenn dann doch eher:

attr <name> onstart A0=last,A1=on,A2=off
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

hajo23

Zitat von: klausw am 04 Mai 2014, 23:17:08
ist mir zu kompliziert ... vielleicht liegt es an der Uhrzeit ;)

auf solche Ideen komme ich als Newbie, wenn ich Suchmaschinen zur Lösungsfindung bemühe :)

ich erkläre es nochmal ausführlich:
am MCP23017 hängen bei mir 8 Relais (Optokoppler) mit empfindlichen Lasten, die bei low anziehen. Wenn das Modul 52_I2C_MCP23017 startet, wird zuerst auf Output geschaltet. Nach poweron stehen die Register des chips standardmäßig auf low, was dann folglich zum AKtivieren der 8 Relais führt. Das muss ich vermeiden.

Zitat von: klausw am 04 Mai 2014, 23:17:08
wenn dann doch eher:

attr <name> onstart A0=last,A1=on,A2=off


sieht gut aus  :D

klausw

#8
Hier eine Version mit Wiederherstellung der Outputs nach reboot.

bitte testen

kann so verwendet werden
attr <name> OnStartup A0=last,A1=on,A2=off
OutputPorts die fehlen werden auf den letzten gespeicherten Zustand gesetzt.
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

hajo23

Zitat von: klausw am 07 Mai 2014, 00:09:21
Hier eine Version mit Wiederherstellung der Outputs nach reboot.

bitte testen

kann so verwendet werden
attr <name> OnStartup A0=last,A1=on,A2=off
OutputPorts die fehlen werden auf den letzten gespeicherten Zustand gesetzt.

hallo klaus,

konnte gerade einen ersten Test machen. Die Ports werden leider noch nicht gesetzt.


define chip RPII2C 1
# attr chip verbose 5
define mcp_20 I2C_MCP23017 0x20
attr mcp_20 IODev chip
attr mcp_20 OutputPorts A0,A1,A2,A3,A4,A5,A6,A7,B0,B1,B2,B3,B4,B5,B6,B7
attr mcp_20 OnStartup A0=last,A1=on,A2=off

logfile:
2014.05.12 20:58:16 1: Including /opt/fhem/FHEM/mcp23017.cfg
2014.05.12 20:58:27 1: mcp_20: Attribut OutputPorts wird gesetzt
2014.05.12 20:58:27 1: Including ./log/fhem.save
2014.05.12 20:58:28 1: mcp_20: Port = A0
2014.05.12 20:58:28 1: mcp_20: PortA0 soll auf Altzustand: on gesetzt werden
2014.05.12 20:58:28 1: mcp_20 set regaddr: 12 inhalt: 01
2014.05.12 20:58:28 1: mcp_20: Port = A1
2014.05.12 20:58:28 1: mcp_20: PortA1 soll auf on gesetzt werden
2014.05.12 20:58:28 1: mcp_20 set regaddr: 12 inhalt: 03
2014.05.12 20:58:28 1: mcp_20: Port = A2
2014.05.12 20:58:28 1: mcp_20: PortA2 soll auf off gesetzt werden
2014.05.12 20:58:28 1: mcp_20 set regaddr: 12 inhalt: 03
2014.05.12 20:58:28 1: mcp_20: Port = A3
2014.05.12 20:58:28 1: mcp_20: PortA3 wird auf Altzustand: on gesetzt (kein Eintrag in on Startup)
2014.05.12 20:58:28 1: mcp_20 set regaddr: 12 inhalt: 0F
2014.05.12 20:58:28 1: mcp_20: Port = A4
2014.05.12 20:58:28 1: mcp_20: PortA4 wird auf Altzustand: on gesetzt (kein Eintrag in on Startup)
2014.05.12 20:58:28 1: mcp_20 set regaddr: 12 inhalt: 1F
2014.05.12 20:58:28 1: mcp_20: Port = A5
2014.05.12 20:58:28 1: mcp_20: PortA5 wird auf Altzustand: on gesetzt (kein Eintrag in on Startup)
2014.05.12 20:58:28 1: mcp_20 set regaddr: 12 inhalt: 3F
2014.05.12 20:58:28 1: mcp_20: Port = A6
2014.05.12 20:58:28 1: mcp_20: PortA6 wird auf Altzustand: on gesetzt (kein Eintrag in on Startup)
2014.05.12 20:58:28 1: mcp_20 set regaddr: 12 inhalt: 7F
2014.05.12 20:58:28 1: mcp_20: Port = A7
2014.05.12 20:58:28 1: mcp_20: PortA7 wird auf Altzustand: on gesetzt (kein Eintrag in on Startup)
2014.05.12 20:58:28 1: mcp_20 set regaddr: 12 inhalt: FF
2014.05.12 20:58:28 1: mcp_20: Port = B0
2014.05.12 20:58:28 1: mcp_20: PortB0 wird auf Altzustand: off gesetzt (kein Eintrag in on Startup)
2014.05.12 20:58:28 1: mcp_20 set regaddr: 13 inhalt: 00
2014.05.12 20:58:28 1: mcp_20: Port = B1
2014.05.12 20:58:28 1: mcp_20: PortB1 wird auf Altzustand: off gesetzt (kein Eintrag in on Startup)
2014.05.12 20:58:28 1: mcp_20 set regaddr: 13 inhalt: 00
2014.05.12 20:58:28 1: mcp_20: Port = B2
2014.05.12 20:58:28 1: mcp_20: PortB2 wird auf Altzustand: off gesetzt (kein Eintrag in on Startup)
2014.05.12 20:58:28 1: mcp_20 set regaddr: 13 inhalt: 00
2014.05.12 20:58:28 1: mcp_20: Port = B3
2014.05.12 20:58:28 1: mcp_20: PortB3 wird auf Altzustand: off gesetzt (kein Eintrag in on Startup)
2014.05.12 20:58:28 1: mcp_20 set regaddr: 13 inhalt: 00
2014.05.12 20:58:28 1: mcp_20: Port = B4
2014.05.12 20:58:28 1: mcp_20: PortB4 wird auf Altzustand: off gesetzt (kein Eintrag in on Startup)
2014.05.12 20:58:28 1: mcp_20 set regaddr: 13 inhalt: 00
2014.05.12 20:58:28 1: mcp_20: Port = B5
2014.05.12 20:58:28 1: mcp_20: PortB5 wird auf Altzustand: off gesetzt (kein Eintrag in on Startup)
2014.05.12 20:58:28 1: mcp_20 set regaddr: 13 inhalt: 00
2014.05.12 20:58:28 1: mcp_20: Port = B6
2014.05.12 20:58:28 1: mcp_20: PortB6 wird auf Altzustand: off gesetzt (kein Eintrag in on Startup)
2014.05.12 20:58:28 1: mcp_20 set regaddr: 13 inhalt: 00
2014.05.12 20:58:28 1: mcp_20: Port = B7
2014.05.12 20:58:28 1: mcp_20: PortB7 wird auf Altzustand: off gesetzt (kein Eintrag in on Startup)
2014.05.12 20:58:28 1: mcp_20 set regaddr: 13 inhalt: 00

2014.05.12 20:58:28 3: mcp_20: failurei in message from chip
2014.05.12 20:58:28 3: Direction: i2cwrite I2Caddress: 32 Register: 0 Data: 0 received: undef
2014.05.12 20:58:28 3: mcp_20: failurei in message from chip
2014.05.12 20:58:28 3: Direction: i2cwrite I2Caddress: 32 Register: 1 Data: 0 received: undef


Gruß,
Hajo

klausw

#10
Zitat von: hajo23 am 12 Mai 2014, 21:12:39
konnte gerade einen ersten Test machen. Die Ports werden leider noch nicht gesetzt.

So, jetzt müsste es gehen...theoretisch ;)

In der vorangegangenen Version wurden die Ports vor Abschluss der Initialisierung gesetzt. Das kann natürlich nicht 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

slonnet

Hallo klausw,
ich teste gerade auch dein Modul.
Erst einmal vorab: tolle Arbeit!

Hab allerdings das Problem das das Ausschalten der Ports zu einem "transmission error" führt.

Einschalten geht problemlos, aber bei ausschalten steht im Log folgender Inhalt:

2014.05.14 16:38:25 1: MCP23017_1 set regaddr: 12 inhalt: 01
2014.05.14 16:38:25 1: MCP23017_1 set regaddr: 12 inhalt: 00
2014.05.14 16:38:25 3: MCP23017_1: failurei in message from chip
2014.05.14 16:38:25 3: Direction: i2cwrite I2Caddress: 32 Register: 18 Data: 0 received: undef

Kann das jemand bestätigen?
Bzw. das könnte auch der Grund sein, warum "attr <name> OnStartup" nicht funktioniert.

Gruss slonnet

klausw

#12
Zitat von: slonnet am 14 Mai 2014, 16:41:11
Hab allerdings das Problem das das Ausschalten der Ports zu einem "transmission error" führt.
das er bisher noch keinem aufgefallen ist verwundert mich :)

das war ein anderer Fehler, eine 0 im Registerinhalt wurde als ungültig erkannt (den "transmission error" solltest Du nur bekommen, wenn Du alle Ports ausschaltest)

Hat aber nix mit OnStartup zu tun. Das sollte auch jetzt auch 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

slonnet

Wow,

das ging ja mal flott!
Mit dem neuen Modul klappt es jetzt auch mit dem Ausschalten ;)

Vielen Dank für die schnelle Hilfe!
Hatte schon an einen Hardware Fehler meinerseits gedacht, weil es wirklich noch keiner gemeldet hatte ;)

klausw

Zitat von: slonnet am 14 Mai 2014, 17:35:31
Wow,

das ging ja mal flott!
Mit dem neuen Modul klappt es jetzt auch mit dem Ausschalten ;)

Vielen Dank für die schnelle Hilfe!
Hatte schon an einen Hardware Fehler meinerseits gedacht, weil es wirklich noch keiner gemeldet hatte ;)
sehr schön

funktioniert OnStartup bei Dir?
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