Modul für die Ansteuerung des MCP23017 I2C Portextender

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

Vorheriges Thema - Nächstes Thema

IPPhoner2b

Kenne mich da zwar nicht so aus, aber könnte hinten als Befehl nicht auch
    fhem "set Ausgang1 on"
Bzw off rein?

Und beim Schalter weis ich nicht, ob da auch noch ein
attr FK.Haustuer event-on-change-reading state
Rein müsste

beSmart

Hallo und vielen Dank für deine Hilfe.

Aber es funktioniert immer noch nicht. Hat sonst jemand eine Idee, warum Ausgang1 nicht per Taster ausschaltet?

Gruß

beSmart

IPPhoner2b

Nur ne Vermutung, aber wird das DOIF nicht nur einmal ausgeführt, außer wenn du mit DOIF always arbeitest?

Und würde dir der Ausgang nicht anfangen zu rattern, weil wenn die Änderung in Kraft tritt, und der Ausgang ist aus, muss er ihn anschalten, dann merkt er, oh der Ausgang ist an, und schaltet ihn aus usw. Oder habe ich da jetzt nen Denkfehler?

Was mir noch auffällt.

Wie hast du den Eingang am Mcp angeschlossen? Da ich das so nicht erkennen kann, müsstest du eigentlich mit dem interrupt Eingang arbeiten, damit fhem überhaupt mitbekommt, dass sich der State vom Eingang überhaupt geändert hat.

beSmart

Hallo.

attr Switch1 do always

habe ich hinzugefügt. Funktioniert immer noch nicht.
ZitatUnd würde dir der Ausgang nicht anfangen zu rattern, weil wenn die Änderung in Kraft tritt, und der Ausgang ist aus, muss er ihn anschalten, dann merkt er, oh der Ausgang ist an, und schaltet ihn aus usw. Oder habe ich da jetzt nen Denkfehler?

Da kannst Du Recht haben. Ich habe da keine Erfahrung und auch keine bessere Idee wie man es sonst lösen könnte. Mir geht es im Prinzip nur darum, den Ausgang auf Tastendruck umzuschalten.

Interrupt habe ich eingerichtet, angeschlossen und funktioniert.

###I2C-Device###
define i2cBus RPII2C 1
attr i2cBus group MCP23017
##
##
###MCP23017
define icMCP23017 I2C_MCP23017 0x20
attr icMCP23017 IODev i2cBus
attr icMCP23017 Interrupt A0,A1,A2,A3,A4,A5,A6,A7,B0,B1,B2,B3,B4,B5,B6,B7
attr icMCP23017 InterruptOut connected_active-low
attr icMCP23017 OutputPorts A1,A2
attr icMCP23017 Pullup A0,A3,A4,A5,A6,A7,B0,B1,B2,B3,B4,B5,B6,B7
attr icMCP23017 group MCP23017

###Interrupt A&B####
define Interrupt RPI_GPIO 4
attr Interrupt active_low yes
attr Interrupt direction input
attr Interrupt group MCP23017
attr Interrupt interrupt both
attr Interrupt userReadings test {fhem ("get icMCP23017")}

define Fk.Haustuer readingsProxy icMCP23017:PortA0
attr Fk.Haustuer event-on-change-reading state
attr Fk.Haustuer fp_Fensterkontakte -80,200,0,
attr Fk.Haustuer fp_UG 210,900,0,
attr Fk.Haustuer group InputPorts
attr Fk.Haustuer valueFn {($VALUE eq "on")?"open":"closed"}

define Ausgang1 readingsProxy icMCP23017:PortA1
attr Ausgang1 group OutputPorts
attr Ausgang1 setFn {($CMD eq "on")?"PortA1 off":"PortA1 on"}
attr Ausgang1 setList on off
attr Ausgang1 valueFn {($VALUE eq "on")?"off":"on"}

define Switch1 DOIF ([Fk.Haustuer] eq "closed" and [Ausgang1] eq "off") (set Ausgang1 on) DOELSEIF ([Fk.Haustuer] eq "closed" and [Ausgang1] eq "on") (set Ausgang1 off)
attr Switch1 do always



Sonst noch eine Idee?

Vielen Dank und Gruß

beSmart


IPPhoner2b

Ah ok, wenn du nur den Ausgang umschalten willst, gibt es für das GPIO Tool auch den Befehl "toggle" , damit müsste es dann ja eigentlich klappen

beSmart

Ähm... toggle hört sich gut an!
Meinst du das Modul Rpi_Gpio? Ich dachte das ist nur für den Gpio-Port des Raspberry. Ich muß das aber über die MCP's machen.

Oder habe ich dich falsch verstanden?

Gruß

beSmart

Newima1201

Hallo zusammen,

ich bin relativ frisch in Sachen fhem unterwegs und habe schon versucht, den PCA9555 zu integrieren, leider nur mit mässigen Erfolg :-(
Daher hab ich jetzt den MCP23017 gewählt.
Ich hab bereits einige Forenbeiträge gesehen und teilweise recht umständliche Konstruktionen mit perl-code gesehen.
Eine recht simple Codierung der Grundfunktion hab ich mal hier:

#************** I2C initialisieren ******************
define i2c RPII2C 1
attr i2c alias Onboard I2C Controller 1
attr i2c room Hardware
#****************************************************

#************** MCP23017 at 0x21 ********************
define ioPort21 I2C_MCP23017 0x21
attr ioPort21 IODev i2c
attr ioPort21 Interrupt B0
attr ioPort21 InterruptOut separate_active-low
attr ioPort21 OnStartup A7=on,A6=on
attr ioPort21 OutputPorts A6,A7
attr ioPort21 invert_input B0
attr ioPort21 room Hardware
#************ Einmal den Chip auslesen, *************
#********** um den I2C zu initialisieren ************
#****************************************************

#*************** GPIO 4 als IRQ-Eingang *************
define IRQ21B RPI_GPIO 4
attr IRQ21B active_low no
attr IRQ21B debounce_in_ms 80
attr IRQ21B direction input
attr IRQ21B interrupt both
attr IRQ21B room Hardware
attr IRQ21B userReadings Port { fhem "get ioPort21" }
#************** Entprellen der Aktion ***************
#** Steigende und fallende Flanke registrieren   ****
#** Wenn IRQ ausgeloest wurde, dann Register lesen **
#** Entprellen des Tasters                         **
#** IRQ Reaktion beide Flanken beide auswerten     **
#** Port lesen und damit den IRQ zurücksetzen      **
#** RPI_GPIO IRQ21B Longpress:on/off wenn Taster   **
#** lange gedrueckt war                            **
#***********************************************

#****************** Output A7 ********************
define prxPortA7 readingsProxy ioPort21:PortA7
attr prxPortA7 group OutputPorts
attr prxPortA7 room Hardware
attr prxPortA7 setFn {($CMD eq "on")?"PortA7 off":"PortA7 on"}
attr prxPortA7 setList on off
#attr prxPortA7 off-for-timer 3.0
#*************************************************

#****************** Output A6 ********************
define prxPortA6 readingsProxy ioPort21:PortA6
attr prxPortA6 group OutputPorts
attr prxPortA6 room Hardware
attr prxPortA6 setFn {($CMD eq "on")?"PortA6 off":"PortA6 on"}
attr prxPortA6 setList on off
#*************************************************

#****************** Input Taster *****************
define Taster1 readingsProxy ioPort21:PortB0
attr Taster1 event-on-change-reading state
attr Taster1 group InputPorts
attr Taster1 room Hardware
attr Taster1 setList pressed released
attr Taster1 valueFn { ($VALUE eq "on") ? "on":"off"}
attr Taster1 webCmd pressed:released
#*************************************************

Damit ist zunächst mal das Modul, 2 Ausgänge und ein Taster initialisiert
Meine Ein und Ausgänge sind invertiert, das bedeutet, das eine LED am Ausgang
AUS ist, wenn der Status des Ausgangs ON ist.
Das ist aber Geschmackssache und eine Frage der Hardwarerealisierung.
Meine Taster schalten gegen Masse und ein pullup-Widerstand sorgt für die High-Definition.

Danach kommt die Logik  :D
Ich habe hier folgende Anforderungen, von denen die ersten mit dem folgenden Code umgesetzt wurden:
1) Taster toggelt einen Ausgang (ein Druck an, Ein Druck aus)


#*************************************************
define A6_toggle dummy
attr A6_toggle event-on-change-reading state
attr A6_toggle room Hardware
attr A6_toggle setList on off
#*************************************************

#*************************************************
define A7_toggle dummy
attr A7_toggle event-on-change-reading state
attr A7_toggle room Hardware
attr A7_toggle setList on off
#*************************************************

# Ausgang Toggeln ***
define A7_DI DOIF ([A7_toggle:state] eq "on" && [Taster1:state] eq "on") (set A7_toggle off) DOELSEIF ([A7_toggle:state] eq "off" && [Taster1:$attr A7_DI do always
attr A7_DI room Hardware


2) Taster kann Treppenhauslicht für eine Zeit x aktivieren (z.B. Licht geht nach Zeitablauf aus)

#*** Verzoegertes ausschalten ****
define A7_out DOIF ([Taster1:state] eq "on" && [prxPortA7:state] eq "on") (set prxPortA7 off) (set prxPortA7 on-for-timer 2.3)

#define A7_out DOIF ([A7_toggle:state] eq "on") (set prxPortA7 on) DOELSEIF ([A7_toggle:state] eq "off") (set prxPortA7 off)
#************************************************


3) Taster kann  2 Ausgänge im Wechsel bedienen (A1 aus: A2 aus -> A1 an: A2 aus --> A1 aus: A2 aus --> A1 aus: A2 an); Ist z.B. für eine Markisensteuerung mit einem Taster ganz schick. Mit jedem Druck geht es einen Schritt weiter.
4) Ein langer Druck des Tasters erzeugt eine andere, zusätzliche Reaktion. Ich benutze das z.B. für An-Abwesenheits-Funktion mittels Taster.
5) Ein zweiter kurzer Druck erzeugt eine weitere zweite Reaktion
Wie gesagt, der Code setzt noch nicht alles um, soll nur zur Anregung dienen :)

Viel Spass noch mit dem MCP23017  ;)


Punkt

Hallo zusammen,

ich habe eine kurze Frage, welche mich jetzt schon seit Wochen beschäftigt und mich immer wieder probieren und suchen lässt - aber leider ohne positives Ergebnis.

Ich habe einen MCP23017 an meinem Cubieboard angeschlossen und triggere über einen Interrupt-GPIO bei jedem Interrupt-Signal vom MCP ein Neueinlesen der Ports.

die relevanten Konfigurationen:

#Definition des Interrupt an GPIO 231
define InterruptI2C20 RPI_GPIO 231
attr InterruptI2C20 active_low yes
attr InterruptI2C20 direction input
attr InterruptI2C20 group Interrupts
attr InterruptI2C20 interrupt both
attr InterruptI2C20 room Technik
attr InterruptI2C20 userReadings test {fhem ("get mcp23017_1")}

#Definition des I2C-Busses
define i2c RPII2C 1
attr i2c group Bus-Systeme
attr i2c room Technik

#Define des MCP23017
define mcp23017_1 I2C_MCP23017 0x20
attr mcp23017_1 IODev i2c
attr mcp23017_1 Interrupt B0,B1,B2,B3,B4,B5,B6,B7
attr mcp23017_1 InterruptOut separate_active-low
attr mcp23017_1 OutputPorts A0,A1,A2,A3,A4,A5,A6,A7
attr mcp23017_1 Pullup B1,B2,B3,B4,B5,B6,B7
attr mcp23017_1 group Devices
attr mcp23017_1 invert_input B1,B2,B3
attr mcp23017_1 room Technik

#ReadingsProxy für den Port welcher das Relais für das Aussenlicht schaltet
define rpxyA1 readingsProxy mcp23017_1:PortA1
attr rpxyA1 alias Kellertür Licht Außen Dauer-An
attr rpxyA1 group readingsProxy Ausgänge mcp23017_1
attr rpxyA1 room Testraum
attr rpxyA1 setFn {($CMD eq "on")?"PortA1 off":"PortA1 on"}
attr rpxyA1 setList on off
attr rpxyA1 valueFn {($VALUE eq "on")?"off":"on"}

#ReadingsProxy  für den PortB3 definieren an dem der Schalter für das Licht angschlossen ist
define rpxySchalterKellerAussen readingsProxy mcp23017_1:PortB3
attr rpxySchalterKellerAussen alias Schalter Kellertür
attr rpxySchalterKellerAussen event-on-change-reading state
attr rpxySchalterKellerAussen group Schalter
attr rpxySchalterKellerAussen room Steuerungen

#Notify zum Schalten des Außenlichts wenn der Schalter betätigt wird
define ntfySchalterKellerAussen notify rpxySchalterKellerAussen.* set rpxyA1 toggle
attr ntfySchalterKellerAussen disable 0
attr ntfySchalterKellerAussen room Steuerungen



Nun aber das was mich die letzten Wochen so fuchst:

Wenn ich den Rechner komplett neu starte und FHEM gestartet ist funktioniert alles wie gewünscht.
Wird der Schalter betätigt wird auch das Licht an/aus geschaltet.

Starte ich anschliessend FHEM aber durch ein SHUTDOWN RESTART neu funktioniert nichts mehr.
Merkürdigerweise ist dann der Interrupt-GPIO einfach nur auf HIGH.

Erst wenn ich in der Detailanzeige des MCP23017 aktualisiere (mit F5) wird der Interrupt-GPIO auf LOW gesetzt.

Wenn das passiert ist dann geht allerdings gar nichts mehr - weder wenn ich den Schalter betätige noch wenn ich die Detailseite aktualisiere oder sonstiges....der MCP scheint kein Interrupt-Signal mehr zu schicken.

Der Interrupt-GPIO ist an INTB des MCP angeschlossen.
Es hat aber auch keine Auswirkung auf den Fehler wenn ich InterruptOut von separate_active-low auf connected_active-low setze...


Kann das evtl. jemand nachvollziehen?

Das Problem muss vermutlich irgendwo beim SHUTDOWN RESTART liegen - wenn ich das System neustarte dann funktioniert alles wieder wie gehabt...


Viele Grüße

Michael
FHEM auf LXD-Container (Ubuntu 24.04) mit 1wire-Bus und I2C-Extensions
Datenbank: influxdb
verschiedene "Satellitensysteme" mit ESP-8266

Punkt

Hallo zusammen,

ich habe diesbezüglich ein wenig weitergeforscht und folgendes Festgestellt:

scheinbar werden die Register durch einen SHUTDOWN RESTART verändert.

Ich habe vor dem Restart einen I2CDUMP ausgelesen (Schalter am MCP23017 an Port B3 war aus):

user@host:~$ sudo i2cdump -y 1 0x20
No size specified (using byte-data access)
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef
00: 00 ff 00 0e 00 ff 00 00 00 00 40 40 00 fe 00 00    ...?......@@.?..
10: 00 f6 ff f6 ff f6 00 00 00 00 00 00 00 00 00 00    .?.?.?..........


und nach dem SHUTDOWN RESTART sah das ganze so aus:

user@host:~$ sudo i2cdump -y 1 0x20
No size specified (using byte-data access)
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef
00: 00 ff 00 0e 00 ff 00 00 00 00 40 40 00 fe 00 01    ...?......@@.?.?
10: 00 f7 ff f6 ff f6 00 00 00 00 00 00 00 00 00 00    .?.?.?..........


...es wurde also durch den Shutdown Restart scheinbar etwas am MCP23017 geändert was den dann irgendwie komplett durcheinander bringt...

Vielleicht hilft das ja beim Nachvollziehen des Problems etwas weiter...


Viele Grüße

Michael
FHEM auf LXD-Container (Ubuntu 24.04) mit 1wire-Bus und I2C-Extensions
Datenbank: influxdb
verschiedene "Satellitensysteme" mit ESP-8266

klausw

Zitat von: Punkt am 13 März 2016, 22:58:04
ich habe diesbezüglich ein wenig weitergeforscht und folgendes Festgestellt:

scheinbar werden die Register durch einen SHUTDOWN RESTART verändert.

unwarscheinlich
die beiden Register 0x0F und 0x11 sind nicht Schreibbar. Sie können ausschließlich gelesen werden.
Der Blich ins Datenblatt zeigt, das es sich um

Register 0x11 -> INTCAPB: zeigt den Zustand des Ports B zum Zeitpunkt des Interrupts an

Register 0x0F ->  INTB: gibt auskunft darüber, welcher Pin des Ports den Interrupt ausgelöst hat
Registerinhalt 0x0F:
00 -> kein Interrupt ist ausgelöst worden -> der Wert in 0x11 ist irrelevant,
   da er nur geändert wird, wenn ein Interrupt auftritt
01 -> GPB0 hat den Interrupt ausgelöst -> 11110110 in 0x11 zeigt, das GPB0 den Wert 0 hat.
   somit hat ein Pegelwechsel von 1 auf 0 am Pin GPB0 einen Interrupt ausgelöst.

Das bedeutet: während des Shutdown/Restart Vorgangs wurde der am Pin GPB0 angeschlossene Schalter betätigt bzw. am GPB0 ist noch etwas anderes angeschlossen.

Das hat also erstmal nix mit deinem Problem zu tun.
Die weiteren Konfigurationsregister sind nach dem Restart wieder exakt so wie vorher eingestellt.

Du hast am MCP23017 den Port A als Ausgang eingestellt. Sind da LEDs/Lampen angeschlossen?
Funktionieren diese nach Shutdown/Restart noch?

Wie legst du den Pi GPIO für den Interrupt an?

Nach meiner Vermutung liegt es am GPIO des Pi, der den Interrupt verarbeiten soll (das einzig komische ist, das aktualisieren auf der Detailseite immer den aktuellen Pinlevel anzeigen müsste).
Bei einem Shutdown/Restart wird der Pi Gpio gewöhnlich erst deaktiviert und dann wieder angelegt.
Wenn dein FHEM allerdings keine Schreibrechte auf den GPIO hat, oder besser gesagt, du die Rechte beim booten in der rc.local oder sonstwo setzt dann kann FHEM in auch nicht mehr anlgen.
Dazu sollte aber eine Fehlermeldung im Log erscheien.

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

Punkt

Hallo Klaus,

erstmal danke für deine Unterstützung!

Kurz zu deinen Hinweisen:

Zitat von: klausw am 15 März 2016, 12:39:38
Das bedeutet: während des Shutdown/Restart Vorgangs wurde der am Pin GPB0 angeschlossene Schalter betätigt bzw. am GPB0 ist noch etwas anderes angeschlossen.

Du hast recht, ich hatte zu dem Zeitpunkt auch noch einen Bewegungsmelder angeschlossen - der hat da ein wenig dazwischengefunkt.

Ich hab die ganze Schaltung jetzt mal soweit zurückgebaut daß ich nur noch den Schalter an B3 angeschlossen hab und an A0 - A7 ein Relaisboard.

Zitat von: klausw am 15 März 2016, 12:39:38
Du hast am MCP23017 den Port A als Ausgang eingestellt. Sind da LEDs/Lampen angeschlossen?
Funktionieren diese nach Shutdown/Restart noch?

Wie oben geschrieben habe ich da ein 8-fach-Relais-Board angeschlossen.
Wenn ich die Ports aus dem Frontend direkt schalte funktionieren die auch noch.

Zitat von: klausw am 15 März 2016, 12:39:38
Wie legst du den Pi GPIO für den Interrupt an?

Die Definition des GPIO hab ich weiter oben ja schon eingefügt - oder was meinst du damit?

Zitat von: klausw am 15 März 2016, 12:39:38
Nach meiner Vermutung liegt es am GPIO des Pi, der den Interrupt verarbeiten soll (das einzig komische ist, das aktualisieren auf der Detailseite immer den aktuellen Pinlevel anzeigen müsste).
Bei einem Shutdown/Restart wird der Pi Gpio gewöhnlich erst deaktiviert und dann wieder angelegt.
Wenn dein FHEM allerdings keine Schreibrechte auf den GPIO hat, oder besser gesagt, du die Rechte beim booten in der rc.local oder sonstwo setzt dann kann FHEM in auch nicht mehr anlgen.
Dazu sollte aber eine Fehlermeldung im Log erscheien.

Das war glaub ich schonmal ein sehr guter Hinweis.

Ich habe nach meinen ganzen Tests festgestellt, daß dem Interrupt-GPIO nach einem shutdown restart das scheinbar ziemlich egal ist wenn der auf LOW gezogen wird (das passiert ja bei einem Interrupt-Signal vom MCP).

Er scheint einfach nicht auszulösen.
Was funktioniert:

Wenn ich fhem beende mit "sudo service fhem stop", dann den GPIO unexportiere und hinterher FHEM wieder starte (ich exportiere den GPIO im Start-Script wenn er noch nicht vorhanden ist), dann funktioniert alles wieder wie gehabt - ich muss also wohl in Richtung Interrupt-GPIO weiterforschen...


....so - viel Text...ich hoffe ich schwafel euch hier nicht voll - eventuell nützt es aber auch mal jemandem der die gleichen Probleme hat...


Viele Grüße

Michael
FHEM auf LXD-Container (Ubuntu 24.04) mit 1wire-Bus und I2C-Extensions
Datenbank: influxdb
verschiedene "Satellitensysteme" mit ESP-8266

klausw

Zitat von: Punkt am 15 März 2016, 19:53:25
Die Definition des GPIO hab ich weiter oben ja schon eingefügt - oder was meinst du damit?

nicht die definition, das anlegen (exportieren) ... hast aber weiter unten die entscheidende Info geliefert.
Du legst den Gpio in Startscript an.
Beim shutdown wird ein unexport ausgeführt, evtl geht da oder beim neu anlegen etwas schief.
Setze das Attribut unexportpin mal auf no.
Damit wird der GPIO beim shutdown nicht abgemeldet.

Hast du einen Pi?
Wenn ja sollte es auch ohne export im Startscript gehen.

[/quote]
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

Punkt

Hallo Klaus,

unexportpin auf no hat leider nix gebracht...

Ich hab aktuell einen Cubieboard2 im Einsatz...

Da muss ich die GPIO beim Starten manuell oder eben irgendwo im Script exportieren.

...ich bin jetzt mal noch am ausprobieren ob WiringCB funktioniert...


Viele Grüße

Michael
FHEM auf LXD-Container (Ubuntu 24.04) mit 1wire-Bus und I2C-Extensions
Datenbank: influxdb
verschiedene "Satellitensysteme" mit ESP-8266

Punkt

...so - WiringCB (WiringPi) funktioniert leider auch nicht.

nach einem Shutdown Restart reagiert der Interrupt einfach nicht mehr...  >:(

Ich werd mich mal in der Richtung weiter schlau machen - will den Thread hier nicht sprengen, da es offensichtlich nicht an dem MCP-Modul liegt...


Viele Grüße

Michael
FHEM auf LXD-Container (Ubuntu 24.04) mit 1wire-Bus und I2C-Extensions
Datenbank: influxdb
verschiedene "Satellitensysteme" mit ESP-8266

klausw

Zitat von: Punkt am 15 März 2016, 23:36:55
Ich werd mich mal in der Richtung weiter schlau machen - will den Thread hier nicht sprengen, da es offensichtlich nicht an dem MCP-Modul liegt...
Naja, aber die MCP Nutzer betrifft es auch.

schaue die mal die Rechte von /sys/class/gpio/ und /sys/class/gpio/gpio231 an

ls -l /sys/class/gpio/
ls -l /sys/class/gpio/gpio231/

und zwar:
- nach dem Neustart vom Cubie
- nach dem Shutdown von FHEM  (sudo service fhem stop / oder shutdown direkt in FHEM)
- nach dem erneuten starten von FHEM (sudo service fhem start)

das bitte hier posten
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