Fehler im Modul 00_RPII2C.pm

Begonnen von Medel, 05 November 2017, 14:57:55

Vorheriges Thema - Nächstes Thema

Medel

Hallo,

bin wahrscheinlich über einen Fehler im Modul 00_RPII2C.pm gestoßen.
in "sub RPII2C_Write" wird über "CallFn($d, "I2CRecFn", $chash, $clientmsg)"  die clientmsg übergeben und anschließend gleich mit "undef $clientmsg" zerstört.
Dadurch kommt sie beim Clienten nicht an.

Ich hoffe ich habe es im richtigen Forumsteil platziert sonst bitte an den Admin weiterleiten.

Mfg

Mario

klausw

Zitat von: Medel am 05 November 2017, 14:57:55
bin wahrscheinlich über einen Fehler im Modul 00_RPII2C.pm gestoßen.
in "sub RPII2C_Write" wird über "CallFn($d, "I2CRecFn", $chash, $clientmsg)"  die clientmsg übergeben und anschließend gleich mit "undef $clientmsg" zerstört.
Dadurch kommt sie beim Clienten nicht an.

Das Unterforum ist korrekt.
Aber wie kommst du zu der Annahme, das die Botschaften nicht beim Client ankommen?
Erst wird CallFn($d, "I2CRecFn", $chash, $clientmsg) ausgeführt.
Danach wird wieder in die übergeordnete Funktion gesprungen und $clientmsg gelöscht.

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

Medel

Hallo,

ich habe in die "I2CRecFn" meines Clienten Log Ausgaben eingefügt. Diese werden jedoch nur angezeigt wenn die Zeile "undef $clientmsg" auskommentiert wird. Offensichtlich wird "I2CRecFn" in einem eigenen Prozess ausgeführt so dass der Rücksprung nach dem Start sofort ausgeführt wird, der Client nach dem Start dann aber keine Daten mehr findet da diese mittlerweile zerstört wurden.

Gruß

Mario

klausw

Hallo Mario,

Zitat von: Medel am 06 November 2017, 17:52:48
ich habe in die "I2CRecFn" meines Clienten Log Ausgaben eingefügt. Diese werden jedoch nur angezeigt wenn die Zeile "undef $clientmsg" auskommentiert wird. Offensichtlich wird "I2CRecFn" in einem eigenen Prozess ausgeführt so dass der Rücksprung nach dem Start sofort ausgeführt wird, der Client nach dem Start dann aber keine Daten mehr findet da diese mittlerweile zerstört wurden.

Von welchen Clienten sprichst du?
Die I2C Module bei bei FHEM mitgeliefert werden sollten alle ihre angeforderten Daten bekommen.
Ich muss mich auch erst wieder einlesen, was ich da angestellt habe.
Wenn ich mich recht erinnere soll RPII2C_Write aber auch nur auf den I2C schreiben.
Wenn du Daten lesen willst gibts RPII2C_Read oder so.
Ob das "undef $clientmsg" notwendig ist weiss ich nicht. Dazu kenne ich mich zu wenig mit Perl aus.


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

Medel

Hallo Klaus,

mein Modul ist für meine selbstgebaute Rolladen Steuerung. RPII2C liefert die Daten bei Read gleich mit zurück. Da ich jedoch auf FRM umstellen wollte lief mein Modul nicht mehr. Bisher hatte ich "I2CRecFn" zwar drinnen aber nicht benutzt. Mit dem Versuch der Änderung über "I2CRecFn" ging dann aber RPII2C nicht mehr. Die Module sind also nicht ohne besondere Maßnahmen tauschbar. Ich habe mittlerweile in mehreren i2c-Modulen gesehen dass für RPII2C Ausnahmen programmiert werden. Könnte vielleicht an diesem Problem liegen.

Gruß

Mario

klausw

Zitat von: Medel am 06 November 2017, 19:47:28
mein Modul ist für meine selbstgebaute Rolladen Steuerung. RPII2C liefert die Daten bei Read gleich mit zurück. Da ich jedoch auf FRM umstellen wollte lief mein Modul nicht mehr. Bisher hatte ich "I2CRecFn" zwar drinnen aber nicht benutzt. Mit dem Versuch der Änderung über "I2CRecFn" ging dann aber RPII2C nicht mehr. Die Module sind also nicht ohne besondere Maßnahmen tauschbar. Ich habe mittlerweile in mehreren i2c-Modulen gesehen dass für RPII2C Ausnahmen programmiert werden. Könnte vielleicht an diesem Problem liegen.

Das RPII2C Modul war als erstes da. Es sind eher Ausnahmen für andere physikalischen Module eingebaut.
Bei einem erfolgreichen Schreibzugriff sendet RPII2C die Daten wieder an das logische Modul zurück. In diesem werden damit die Readings aktualisiert.
Das FRM Modul macht dies nicht. Firmata sendet kein Acknowledge zurück und das FRM Modul quittiert nichts.
Daher sollte nach Aufruf der I2CWrtFn mit i2cwrite noch ein i2cread für Daten erfolgen die zum aktualisieren der Readings verwendet werden.
Ich wollte keine Reading aktualisieren ohne zu wissen ob der Schreibvorgang erfolgreich war.
Das ist alles.
Meiner Meinung nach gehört dieses zurücklesen in das FRM Modul rein. Aber dazu muss es erstmal wieder einen Maintainer geben.

Wenn ich es richtig verstehe hast du bisher nur die Daten über I2C an deine Rolladen Steuerung gesendet, aber nichts zurück gelesen?
Daher ist dir das bisher nicht aufgefallen. Mit dem undef sollte es aber nichts zu tun haben.


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

Medel

Hallo Klaus ,

bei folgenden Codezeilen in meinem Programm
CallFn($pname, "I2CWrtFn", $phash, \%sendpackage);
CallFn($pname, "I2CWrtFn", $phash, \%receivepackage);
   
kommt mit der Zeile "undef $clientmsg;" in RPII2C_Write($$)  keine Log Ausgabe

ohne kommt folgendes:
I2C_Rolladen_I2CRec
I2C_Rolladen_I2CRec name: WohnzimmerNord
I2C_Rolladen_I2CRec phash: HASH(0x1a5ed58)
I2C_Rolladen_I2CRec pname: I2C
I2C_Rolladen_I2CRec Richtung: i2cread
I2C_Rolladen_I2CRec Receive msg: 100 0 0 206 202
I2C_Rolladen_I2CRec
I2C_Rolladen_I2CRec name: WohnzimmerNord
I2C_Rolladen_I2CRec phash: HASH(0x1a5ed58)
I2C_Rolladen_I2CRec pname: I2C
I2C_Rolladen_I2CRec Richtung: i2cwrite
I2C_Rolladen_I2CRec Receive msg:


hier mein bisheriger Programmteil:
sub I2C_Rolladen_I2CRec($@) { # ueber CallFn vom physical aufgerufen
my ($hash, $clientmsg) = @_;
my $name = $hash->{NAME};
my $phash = $hash->{IODev};
my $pname = $phash->{NAME};
        Log3 $name,5, "I2C_Rolladen_I2CRec";
  while ( my ( $k, $v ) = each %$clientmsg ) { #erzeugen von Internals fuer alle Keys in $clientmsg die mit dem physical Namen beginnen
    $hash->{$k} = $v if $k =~ /^$pname/ ;
  }
        Log3 $name,5, "I2C_Rolladen_I2CRec name: ".$name;
        Log3 $name,5, "I2C_Rolladen_I2CRec phash: ".$phash;
        Log3 $name,5, "I2C_Rolladen_I2CRec pname: ".$pname;
        Log3 $name,5, "I2C_Rolladen_I2CRec Richtung: ".$clientmsg->{direction};
        Log3 $name,5, "I2C_Rolladen_I2CRec Receive msg: ".$clientmsg->{received};
}

da noch nicht einmal der Log hinter der Deklaration ausgegeben wird gehe ich davon aus dass der Programmteil nicht aufgerufen wird.

es werden auch immer beide CallFn Zeilen ausgeführt und dann erst kommt die Log Ausgabe von "I2C_Rolladen_I2CRec($@)"

Gruß

Mario

klausw

kannst du bitte das komplette Modul posten

ich kann im Moment nichts erkennen, woran es liegen könnte
Sicher könnte ich das undef entfernen, allerdings weiß ich nicht ob dadurch der Speicher zugemüllt wird
Außerdem ist mir kein Modul bekannt wo es diesbezüglich Probleme gibt.
Irgendwo muß es doch einen Unterschied geben.
Hast du andere I2C Devices am laufen?
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