Firmata Update für Firmware-Versionen ab 2.7

Begonnen von jensb, 29 Dezember 2017, 21:35:33

Vorheriges Thema - Nächstes Thema

jensb

Ich hatte mich schon mehrmals gefragt, was das Modul FRM_I2C macht. Aus der Modulhilfe bin ich nicht so recht schlau geworden und habe es einfach mal ausprobiert.

Die Funktion ist ähnlich wie die des Linux-Kommandozeilentool i2cdump und kann daher z.B. zur Diagnose verwendet werden. Allerdings ist der Output der aktuellen Version mehr verwirrend als hilfreich, da er nicht initialisiert wird und sich beim Start erst mit zufälligen Werten füllt, bis die endgültige Byteanzahl erreicht ist.

Auf GitHub gibt es nun eine neue Version von FRM und FRM_I2C, die den Output von FRM_I2C zunächst mit 256 Nullen initialisiert. Auch die Modulhilfe von FRM_I2C wurde aktualisiert.

Prinzipiell könnte man in das Modul auch eine I2C-Write-Funktion integrieren, wenn dafür Bedarf besteht.

Grüße,
Jens
FHEM 6.1 - RPi 4 Raspbian 12 + PiTFT - OPi Zero Armbian 5.35
EnOcean - (W)LAN/Firmata: BMP180, TSL2561, SHT21, Heatronic 3, OBIS - WLAN/ESP8266: Gardena 1251, Zirkulationspumpe - RTL433: Oregon - Bluetooth - MQTT
Contributions: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/jensb

JensS

Ist das dann so, dass man dann I2C-Geräte direkt (ohne spez. FRM-Modul) ansprechen kann (z.B. SSD1306)?
Das fände ich super und ich könnte endlich mein FRM_LCD in den verdienten Ruhestand schicken.

Gruß Jens
Debian auf APU2C4, HM-CFG-USB2, SIGNALduino, HM-ES-PMSw1-Pl, TFA 30.3121, TFA 30.3125, ITS-150, PIR-5000, configurable Firmata USB & LAN, 1-wire: DS-18B20, DS-18S20, DS-2408, DS-2413, diverse I2C-Komponenten, zigbee2mqtt, ESPEasy etc.

jensb

ZitatIst das dann so, dass man dann I2C-Geräte direkt (ohne spez. FRM-Modul) ansprechen kann (z.B. SSD1306)?
Ja, aber ob das praktikabel ist, hängt davon ab, wie komplex der erforderliche Ablauf ist.

Speziell das SSD1306 ist kein Text-Display. Du müsstest also zuerst den Text zu Pixeln rendern und die dann Byteweise übertragen. Das ist kein Job für DOIF & Co. Auf 'nem Arduino gibt es dafür spezielle Bibliotheken. Die in Perl nachzubauen dürfte nicht trivial sein, aber vielleicht hast du ja schon was passendes.

Werde das Write bei Gelegenheit einbauen, dann kannst du ja 'mal einen Test machen.

Grüße,
Jens
FHEM 6.1 - RPi 4 Raspbian 12 + PiTFT - OPi Zero Armbian 5.35
EnOcean - (W)LAN/Firmata: BMP180, TSL2561, SHT21, Heatronic 3, OBIS - WLAN/ESP8266: Gardena 1251, Zirkulationspumpe - RTL433: Oregon - Bluetooth - MQTT
Contributions: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/jensb

jensb

Habe FRM_I2C auf Anregung von @dirigent um eine Schreibfunktion erweitert. Man kann nun auch das periodische Lesen deaktivieren und mit get und set Register(-gruppen) einzeln lesen und schreiben. Bitte berücksichtigen, dass man über Firmata in FHEM nur nicht-blockierend lesen kann, d.h. man sendet eine Leseanforderung und die Daten kommen erst etwas später, sind also nicht schon da, wenn das get Kommando fertig ist - man kann den Datenempfang aber z.B. mit einem notify einsammeln. Außerdem kann man bei Firmata ein paar Lese- und Schreibanforderung gemischt hintereinander absetzten ohne auf eine Rückmeldung zu warten, da Firmata die I2C-Kommandos puffert.

Zur Installation bitte FRM und FRM_I2C gleichzeitig von GitHub aktualisieren.

Im dem Zusammenhang wurde auch die I2C Fehlerbehandlung von FRM überarbeitet. Wenn man mit Firmata auf den I2C-Bus zuzugreift und das Firmata-Device nicht mit FHEM verbunden ist, gibt es nun eine passende Fehlerrückmeldung über das Internal SENDSTAT. Das kann je nach I2C-Modul z.B. beim FHEM Neustart auftreten. Getestet habe ich es mit I2C_BMP180 und I2C_TSL2561, beide kommen ohne Moduländerung damit zurecht.

Bei der Anpassung der I2C Fehlerbehandlung ist mir ein Bug im Modul GPUtils.pm aufgefallen:
sub GP_Catch($) {
  my $exception = shift;
  if ($exception) {
    $exception =~ /^(.*)( at.*FHEM.*)$/;
    return $1;
  }
  return undef;
}

Ziel dieser sub ist es meiner Ansicht nach, den Text vor dem Perl-Stacktrack abzugreifen. Die 1. Matchgruppe $1 ist aber aktuell immer leer, da das Ende wohl nicht passt (nach mehreren Newlines steht am Ende des Stacktrace meist etwas wie "... called at fhem.pl line 728"). Entfernt man das "$" aus dem Match, klappt es wieder. GP_Catch wird von einer Reihe von Modulen verwendet (FRM, MYSENSORS_DEVICE, OWX_FRM, OWxxxxx), deshalb möchte ich das nicht einfach ändern.

Rückmeldungen sind erwünscht.

Grüße,
Jens
FHEM 6.1 - RPi 4 Raspbian 12 + PiTFT - OPi Zero Armbian 5.35
EnOcean - (W)LAN/Firmata: BMP180, TSL2561, SHT21, Heatronic 3, OBIS - WLAN/ESP8266: Gardena 1251, Zirkulationspumpe - RTL433: Oregon - Bluetooth - MQTT
Contributions: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/jensb

JensS

Danke dir Jens, ich probiere es nächste Woche mit einem DS2482-100 und einem SSD1306 aus.

Gruß Jens
Debian auf APU2C4, HM-CFG-USB2, SIGNALduino, HM-ES-PMSw1-Pl, TFA 30.3121, TFA 30.3125, ITS-150, PIR-5000, configurable Firmata USB & LAN, 1-wire: DS-18B20, DS-18S20, DS-2408, DS-2413, diverse I2C-Komponenten, zigbee2mqtt, ESPEasy etc.

jensb

Hallo allerseits,

dieser Thread ist schon lange beendet.

Es ist aber nicht ganz einfach, möglichst viele "Betroffene" zu erreichen, deshalb hier der Hinweis, dass es Firmata-Neuigkeiten gibt, die alle Anwender betreffen.

Grüße,
Jens
FHEM 6.1 - RPi 4 Raspbian 12 + PiTFT - OPi Zero Armbian 5.35
EnOcean - (W)LAN/Firmata: BMP180, TSL2561, SHT21, Heatronic 3, OBIS - WLAN/ESP8266: Gardena 1251, Zirkulationspumpe - RTL433: Oregon - Bluetooth - MQTT
Contributions: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/jensb