I2C HWaccess Fehler ( RPII2C )

Begonnen von roli, 28 Januar 2018, 11:55:45

Vorheriges Thema - Nächstes Thema

roli

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 ?






FHEM auf Debian Wheezy(RASPI), 2 * CUL868/433 *  FS20 STR, 2 * HMS100 T, 2 * , 1* FS20 SU, 2 *  FS20 SM8, 2 ; 1-wire Temp, GPIO based Relais-Schalter;i2c Bus
Integration von Sonnenbatterie Eco8;
Elektro  Nachspeicher-Ofen Ladesteuerung,
Haus Lüftung,
Integration von HardwareAlarmanlag

klausw

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?
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