I2C_PCF8574 Timing Problem - Output

Begonnen von audimax, 02 November 2021, 14:37:12

Vorheriges Thema - Nächstes Thema

audimax

Hallo zusammen,

nachdem jetzt sehr lange nichts mehr passiert ist in meinem FHEM habe ich nun etwas Zeit an verschiedenen Dingen weiter zu machen.

Kurz zur Konfiguration:

Die PCF8574-Platinen (H&K) sind über einen Arduino mit Firmata über Netzwerk angeschlossen.
Habe nur reine Inputs oder Outputs. Das Problem hier betrifft die Outputs

PCF8574 => ArduinoFirmata => FRM => I2C_PCF8574 => ReadingsProxy => Rollo

Die Rollläden werden mit Rollo über den Umweg mit ReadingsProxy gesteuert. Das funktioniert für jeden einzelnen auch sehr gut, nur wenn zwei (oder mehr) Rollläden gleichzeitig fahren will gibt es das Problem, dass nur ein Rollladen fährt.

Soweit ich verstehe ist das Problem folgendes:

Im Modul I2C_PCF8574 wird für den Output geschaut, welche Ports geschaltet werden und der Status der anderen Ports dann aus dem Reading genommen. Danach wird der neue Wert auf den i2c Bus geschrieben und danach der neue Status der Ports über I2C abgefragt.
Hier ist, denke ich das Problem. Wenn jetzt zwei Ports gleichzeitig geschrieben werden passt das Reading noch nicht zum neuen Port Status, da der ja erst abgefragt wird, der Fahrbefehl aber gleichzeitig ankommt.

Habe ich eine Möglichkeit da rundum zu kommen? Gibt es eine Option für reinen Output nicht den Weg über den I2C Bus zu gehen um das neue Reading zu setzen?
Kann ich irgendwelche Daten liefern, die helfen?

Danke und viel Grüße
Max

audimax

Hallo,

Anscheinend bin ich damit zwar alleine, aber vielleicht hilft es nochmal.
Konnte das Problem lösen:
Es ist tatsächlich ein Problem mit dem Timing, da ja der aktuelle Wert der Ports über den Bus zurückgelesen wird.
Mein Ansatz war jetzt den Wert der Readings direkt aus der Ausgabe zu setzen und damit den Umweg über den Bus zu sparen (für den fällt mir auch kein Grund ein, warum der da sein muss, evtl bei gemischten In und Outputs).
Ideal wäre aus meiner Sicht das ganze noch zu trennen in zwei Abschnitte. Set sollte den Wert der Ports bestimmen und ein Helper im Hintergrund sollte den Zustand dann umsetzen.

Für mich funktioniert es erstmal soweit mit folgendem Patch:
39a40,41
>         my $sbyte = 0;
>         my $sval = 0;
55c57
< my $sbyte = 0;
---
> # my $sbyte = 0;
74c76
< my $sbyte = 0;
---
> # my $sbyte = 0;
102c104,119
< I2C_PCF8574_Get($hash, $name) if $phash->{TYPE} ne "RPII2C"; # Bei allen IODevs ausser RPII2C Daten zuruecklesen, da diese sondt nicht aktualisiert werden
---
> #        if ( 1 ) {

> #  I2C_PCF8574_Get($hash, $name) if $phash->{TYPE} ne "RPII2C"; # Bei allen IODevs ausser RPII2C Daten zuruecklesen, da diese sondt nicht aktualisiert werden
> #  } else {
>         
>         $sbyte = $sendpackage{data};
>         Log3 $hash, 5, "$hash->{NAME} Output: write state without get: 0b" . sprintf("%08b",$sbyte);
>         readingsBeginUpdate($hash);
>         readingsBulkUpdate($hash, 'state', $sbyte);
>         foreach (0..7) {
>   $sval = $sendpackage{data} & (1 << $_);
>   $sval = $sval == 0 ? "on" :"off";
>   readingsBulkUpdate($hash, 'Port'.$_ , $sval) unless (ReadingsVal($name,'Port'.$_,"") eq $sval);# || $_ ~~ @inports );
> }
>         readingsEndUpdate($hash, 1);
> #  }


Nicht schön, aber perl ist nicht meine native Sprachen ;-)
Läuft bei mir seit einem Monat stabil.

Viele Grüße
Max

ichauch

Hallo,
ich habe meine Rollläden auch so angesteuert und das selbe Problem festgestellt. Ich habe auch schon viel darüber gesucht, aber das hier ist der einzige Hinweis, wie jemand das Problem gelöst hat.
Leider gehn meine Kenntnisse nicht so weit, dass ich das Problem allein lösen kann. Deshalb eine Frage zum Verständniss.

Mit diesem Code wird die Datei "52_I2C_PCF8574.pm" verändert? Was passiert bei einem Fhem-Update damit?

Schon mal vielen, vielen Dank.

Gruß Michael

tesemebe

#3
Zitat von: ichauch am 17 Juli 2024, 09:59:08Hallo,
ich habe meine Rollläden auch so angesteuert und das selbe Problem festgestellt. Ich habe auch schon viel darüber gesucht, aber das hier ist der einzige Hinweis, wie jemand das Problem gelöst hat.
Leider gehn meine Kenntnisse nicht so weit, dass ich das Problem allein lösen kann. Deshalb eine Frage zum Verständniss
Mit diesem Code wird die Datei "52_I2C_PCF8574.pm" verändert? Was passiert bei einem Fhem-Update damit?

Schon mal vielen, vielen Dank.

Gruß Michael
Ich verstehe auch nicht, warum dieser Code für die Datei 52_I2C_PCF8574.pm nicht funktioniert. Kann jemand die Frage beantworten?

eisman

hi,

das Problem gibt es auch mit dem ESP8266 und ESP32 mit PCF8574,
wenn ich das nach 3 Jahren noch richtig im Kopf habe, liegt es
am Chip selber, die Port werden als BIT gelesen und geschrieben.

meine lösung, die bis heute ohne Probleme läuft, die Rollo werden
direkt vom ESP gesteuert, alles andere Fenstersensoren tür usw
laufen über den PCF8574. Oder mal MCP23017(16port) ausprobieren (ohne Garantie)
ich hatte bisher keine Probleme.

gruss
1x FHEM Debian, Homematic,ZigBee,FS20 / 1X Raspberry, ConBee / 5x ESP
1x FHEM Debian, Homematic,ZigBee         / 1X Raspberry, ConBee / 5x ESP
1x FHEM Debian,MQTT                               / 1X Raspberry, i2c,onewire,gpio
1x auf Windows 2012 Hyper-V-S