Bisher plage ich mich seit 2 Monaten mit diversen I2C Problemen herum. Mittlerweile bin ich dazu übergegangen mit Teile
von Horter&Kalb zuzulegen, wobei ich damit viel besser fare.
Setup:
* Raspi mit Horter I2C Repeater ( INT auf GPIO 23 ) für Schnittstelle zu I2C Bus
* I2C Bus Kabel -- verdrillt ca 1,2m lang
* Horter I2C Input Modul ( INT zu Repeater )
* Horter I2C Extender mit angeschlossenem MCP23017 chip für 2x8 port Ausgang
Bisher hatte ich immer mal wieder I2C Problem im log, welche dann komischerweise wieder ca 16 Std. weg waren nachdem ein
Input Signal kam. damals hatte ich den I2C Repeater noch nicht sondern nur einen China LEvel shifter mit I2C Extender.
Stand:
+ Die ganze Nacht durch ist eigentl. alles ganz gut, bis auf folhebde Ausnahme gelaufen :
2018.01.27 21:20:17 1: *** NT- Signal on ****************
2018.01.28 00:50:18 1: *** NT- Signal off ****************
2018.01.28 01:50:18 1: *** NT- Signal on ****************
2018.01.28 04:33:27 3: i2cBus: HWaccess blockweise nach 0x20 schreiben, Reg: 0x12 Inh: 64, laenge: 2| -> syswrite failure: Eingabe-/Ausgabefehler
2018.01.28 04:33:27 3: icMCP23017: failure in message from i2cBus
2018.01.28 04:33:27 3: Direction: i2cwrite I2Caddress: 0x20 Register: 0x12 Data: 0x40 received: undef
2018.01.28 06:20:20 1: *** NT- Signal off ****************
2018.01.28 09:00:00 3: alive_check: 1
Folgende Defs sind vorhanden:
# -- I2C Bus Nuer RAspi : 0 -- Alt: auf 1 !!
define i2cBus RPII2C 1
attr i2cBus room hidden
# MCP23017- Adresse 0x20
define icMCP23017 I2C_MCP23017 0x20
attr icMCP23017 IODev i2cBus
attr icMCP23017 OutputPorts A0,A1,A2,A3,A4,A5,A6,A7,B0,B1,B2,B3,B4,B5,B6,B7
attr icMCP23017 poll_interval 10.1
Der Fehler kommt nicht aus dem 52_I2C_MCP23017.pm sonder ich denke sollte eher aus 00_RPII2C.pm kommen.
Allerdings gibt es dort nur 1 Stelle für die Ausgabe des obigen Fehlers oder es gibt sonst noch in einem anderen Modul etwas:
sub RPII2C_HWACCESS_ioctl($$) {
my ($hash, $clientmsg) = @_;
my $status = "error";
Log3 $hash, 5, "$hash->{NAME}: HWaccess I2CAddr: " . sprintf("0x%.2X", $clientmsg->{i2caddress});
my ($fh, $msg) = undef;
my $ankommen = "$hash->{NAME}: vom client empfangen";
foreach my $av (keys %{$clientmsg}) { $ankommen .= "|" . $av . ": " . $clientmsg->{$av}; }
Log3 $hash, 5, $ankommen;
#Log3 $hash, 1, $ankommen if $clientmsg->{test} eq "local";
my $i2caddr = hex(sprintf "%x", $clientmsg->{i2caddress});
if ( sysopen(my $fh, $hash->{DeviceName}, O_RDWR) != 1) { #Datei oeffnen
Log3 $hash, 3, "$hash->{NAME}: HWaccess sysopen failure: $!"
} elsif( not defined( ioctl($fh,$I2C_SLAVE,$i2caddr) ) ) { #I2C Adresse per ioctl setzen
Log3 $hash, 3, "$hash->{NAME}: HWaccess (0x".unpack( "H2",pack "C", $clientmsg->{i2caddress}).") ioctl failure: $!"
# } elsif (defined($clientmsg->{nbyte}) && defined($clientmsg->{reg}) && defined($clientmsg->{data}) && $clientmsg->{direction} eq "i2cblockwrite") { #blockweise schreiben
} elsif ( defined($clientmsg->{data}) && $clientmsg->{direction} eq "i2cwrite") { #blockweise schreiben
my $data = defined($clientmsg->{reg}) ? chr($clientmsg->{reg}) : undef;
foreach (split(" ", $clientmsg->{data})) {
$data .= chr($_);
}
my $retval = syswrite($fh, $data, length($data));
unless (defined($retval) && $retval == length($data)) {
Log3 $hash, 3, "$hash->{NAME}: HWaccess blockweise nach 0x".unpack( "H2",pack "C", $clientmsg->{i2caddress})." schreiben, " . (defined($clientmsg->{reg}) ? "Reg: 0x". unpack( "H2",pack "C", $clientmsg->{reg}) : "") . " Inh: $clientmsg->{data}, laenge: ".length($data)."| -> syswrite failure: $!";
} else {
$status = "Ok";
Log3 $hash, 5, "$hash->{NAME}: HWaccess block schreiben, " . (defined($clientmsg->{reg}) ? "Reg: 0x". unpack( "H2",pack "C", $clientmsg->{reg}) : "") . " Inh(dec):|$clientmsg->{data}|, laenge: |".length($data)."|";
}
Das "sysopen" hat wohl funktioniert, aber das nachfolgende "ioctl" nicht ! Aber wie gesagt nur 1 mal durch die Nacht.
Wie kann dies sein ? --
Ist dies durchaus normal, dass mal sowas passiert ? Dann ist es ja OK, oder muß ich weiter nach einem Problem suchen.
Eigentlich ist es so, dass ich jede Minute, den einen oder anderen Ausgang am MCP23017 angeschlossenen Relais schalte - z.b.
auf "off", aber auch nicht nochmal abfrage ob er nicht schon auf "off ist.
Sollte ich hier optimieren ?
Der Text "Eingabe-/Ausgabefehler" ist eine Systemmeldung. Und ja, er wird vom RPII2C Modul gemeldet. Dieses kümmert sich um den Hardwarezugriff.
Das sollte nicht kommen.
Die Frage ist, wodurch dies verursacht wird.
Minütliche Abfragen können das meiner Meinung nach nicht verursachen. Die Anfragen werden alle nacheinander vom Modul RPII2C verarbeitet
Hast du andere Dienste laufen, die auf den I2C zugreifen?
Ist die Spannungsversorgung der I2C Module stabil?
Laufen Module, die FHEM blockieren?