16er Relais Modul

Ziel: Zwei 8er Relais Boards mit einem MCP 23017 ansteuern.

Achtung: i2c muss konfiguriert sein.

Wichtige Parameter

  • Das Relaisboard benötigt 400mA bei 5V wenn alle gleichzeitig eingeschaltet sind
  • Die Eingänge schalten gemäß folgender Charakteristik
    • 0V..0,5V Low (Relais EIN)
    • 2,5V..5V High (Relais AUS)
    • Benötigter Strom im Low-Zustand je nach Spannung: Bei 2,5V: 0,1mA; 3,3V: 0,18mA; 5V: 0,35mA

FIXME

Alle Kommandos zur direkten Eingabe an der telnet-Schnittstelle von fhem vorgesehen:

I2C

{
  my $room="ops";; \
  fhem(" \
define i2c RPII2C 1;; \
attr i2c alias Onboard I2C Controller 1;; \
attr i2c room $room;; \
  ");;
}

MCP 23017

Device einrichten und testen. Weitere Infos sind auf der Seite mcp23017 zu finden.

MCP23017 Device erzeugen:

{
  my $device="i2c24";; \
  my $address="0x24";; \
  my $room="ops";; \
  fhem(" \
define $device I2C_MCP23017 $address;; \
attr $device IODev i2c;; \
attr $device room $room;; \
attr $device OutputPorts A0,A1,A2,A3,A4,A5,A6,A7,B0,B1,B2,B3,B4,B5,B6,B7;; \
# zunächst alle Output-Ports auf 'on' setzen damit die angeschlossenen Relais ausgeschaltet sind;; \
set $device PortA0,PortA1,PortA2,PortA3,PortA4,PortA5,PortA6,PortA7 on;; \
set $device PortB0,PortB1,PortB2,PortB3,PortB4,PortB5,PortB6,PortB7 on;; \
  ");;
}

Für alle Relais Proxies definieren

Perl-Schleife:

{ 
  my $prefix="relais_24_";; \
  my $device="i2c24";; \
  my $room="ops";; \
  foreach my $p (A..B) { \
  foreach my $i (0..7) { \
  my $j=$i+1;; \
  fhem(" \
    setdefaultattr valueFn {(\$VALUE eq 'on')?'off':'on'};; \
    define $prefix$p$i readingsProxy $device:Port$p$i;; \
    attr $prefix$p$i room $room;; \
    attr $prefix$p$i devStateIcon on:on:off off:off:on;; \
    attr $prefix$p$i alias $prefix$p $i (In$j);; \
    attr $prefix$p$i setList on off;; \
    attr $prefix$p$i setFn {(\$CMD eq 'on')?'Port$p$i off':'Port$p$i on'};; \
");; } } }

Eine kleine Schleife zum Löschen aller Relais Proxies:

{ my $prefix="relais_24_";; \
foreach my $p (A..B) { foreach my $i (0..7) { fhem("delete $prefix$p$i");; } } }