[Firmata] - Update - Device::Firmata wird aus FHEM entfernt

Begonnen von jensb, 26 September 2020, 21:39:45

Vorheriges Thema - Nächstes Thema

jensb

Ein wichtiges Update der 10/20_FRM-Module steht zum Testen bereit mit folgenden Schwerpunkten:


  • Entfernen des Perl-Moduls Device::Firmata aus FHEM (Betrifft auch Nutzer von OWX_FRM und OWX_ASYNC)
  • Zuverlässigkeit von Firmata-Devices mit Netzwerkschnittstelle
  • Standardisierung der 10/20_FRM-Module

Es gibt noch weitere Detailverbesserungen, die u.a. auf den Rückmeldungen einiger Anwender basieren. Mehr Infos dazu finden sich am Ende des Beitrags.

Die Beta-Versionen der neuen FHEM-Modulversionen sind beigefügt und finden sich auch auf GitHub.

Mir fehlt z.T. die Hardware, um alle überarbeiteten Module auch funktionell zu testen (FRM_RGB, FRM_ROTENC, FRM_SERVO, FRM_STEPPER). Daher bitte ich um eure Rückmeldung, vor allem auch dann, wenn es bei euch funktioniert. Wer die Beta-Versionen ausprobiert, sollte vorher auf jeden Fall seine aktuellen Modulversionen sichern, um bei Bedarf schnell wieder zurückstellen zu können.


zu 1.) Entfernen des Perl-Moduls Device::Firmata aus FHEM

FHEM und die FHEM-Module stehen unter der Lizenz GPLv2. Die FHEM-Distribution enthält aber momentan noch Module mit anderen Lizenzen. Die sollen nun schrittweise aus der FHEM-Distribution entfernt werden und zu diesen Modulen zählt das Perl-Modul Device::Firmata. Das Entfernen bedeutet nicht, dass diese Module nicht mehr mit FHEM verwendet werden können, sondern nur, dass sie nicht mehr automatisch mit FHEM installiert und aktualisiert werden. Für Perl-Module gibt es für das Installieren und Aktualisieren CPAN, Details hierzu findet man in der FHEM-Wiki.

Da das Perl-Modul Device::Firmata bisher automatisch installiert wurde, sind die darauf aufbauenden FHEM-Module nicht darauf vorbereitet, dass es nicht installiert sein könnte. In Folge stürzt FHEM ab, wenn das Perl-Modul Device::Firmata aus dem FHEM-Unterverzeichnis gelöscht wird oder wenn man bei einer FHEM-Neuinstallation ein define für ein Firmata-Modul durchführt. Damit das nicht passiert, gibt es ein Update für das Modul 10_FRM.pm und alle 20_FRM_XXXXX.pm Module. Die neuen Modulversionen verhindern den Absturz von FHEM und zeigen eine Fehlermeldung, wenn Device::Firmata nicht installiert ist oder eine veraltete Version hat.

Für das Modul 11_OWX_FRM.pm ist eine ähnliche Änderung in Arbeit, aber aktuell noch nicht verfügbar.

Unklar ist, ob es auch entsprechnde Anpassungen bei 00_OWX_ASYNC.pm geben wird, da es schon länger nicht mehr aktualiert wurde, denn auch dieses FHEM-Modul kann mit Firmata genutzt werden. Sofern man aber Device::Firmata selbst installiert, kann es weiter verwendet werden.


Ich empfehle allen Firmata-Anwendern schon jetzt die FHEM-Version 0.64 von Device::Firmata zu entfernen und auf die Perl-Version 0.69 umzusteigen, denn die FHEM-Version ist bereits seit längerem veraltet und enthält bekannte und behobene Fehler.


Die Umstellung ist im Normalfall schnell erledigt. Auf einem Linux-Derivat verwendet man dazu die Kommandozeile:


sudo cpan install Device::Firmata
cd <FHEM-Installationsverzeichnis>/FHEM/lib/Device
optional: cp -a Firmata* <Sicherungsziel>
sudo rm -r Firmata*
sudo service fhem restart


Außerderm sollte man noch "FHEM/lib/Device/Firmata.*" zum FHEM-Attribut "exclude_from_update" von "global" hinzufügen, damit die veraltete Version von Device::Firmata nicht wieder installiert wird.


zu 2.) Zuverlässigkeit von Firmata-Devices mit Netzwerkschnittstelle

Wenn man mit einem Smarthome-System nicht nur experimentiert sondern damit Komfortfunktionen bereit stellt, dann möchte man sich auch darauf verlassen können. Trotzdem kann natürlich eine Störung in einem Sensor oder Aktor auftreten. Um so ärgerlicher ist es, wenn das länger unbemerkt bleibt. Die neue Version von FRM verbessert daher die Verbindungsüberwachung für Firmata-Devices, die per TCP/IP angebunden sind, also per LAN oder WLAN. Ein Verbindungsabbruch wird nun zuverlässiger erkannt und ändert den State des FRM-Devices. Je nach Implementierung in den jeweiligen FRM-Client-Modulen kann man so nicht akualisierte Messwerte und fehlgeschlagene Aktionen erkennen.

Außderdem gibt es ein neues Attribut "ping-interval". Wenn man es setzt sendet FRM periodisch den String "ping" an das Firmata-Device. Das sorgt für eine beschleunigte Verbindungsabbrucherkennung für den Anwendungsfall, wo FHEM dem Firmata-Device normalerweise nichts sendet.

Hat man den Anwendungsfall, dass das Firmata-Device im Normalfall nichts an FHEM sendet, sollte man in seinen Firmata-Sketch etwas entsprechendes einbauen und das Attribut "errorExclude" von "FRM" auf "ping" setzen, z.B.:


#define PING_PERIOD 20000 // [ms]

unsigned long pingSent = 0;
char message[8];

void loop()
{
  ...

  unsigned long currentMillis = millis(); 
  if (stream.status() == ESTABLISHED && (currentMillis - pingSent) >= PING_PERIOD)
  {
    // send some data to detect loss of connection indirectly
    sprintf(message, "ping");   
    Firmata.sendString(message);
    pingSent = currentMillis;
  }

  ...
}


Zusätzlich gibt es das neue Attribut "receiveTimeout". Wenn man es setzt trennt FRM die Verbindung, wenn innerhalb des konfigurierten Timeouts keine Daten vom Firmata-Device empfangen werden.

Kombiniert man das periodische Senden und Empfangen von Daten mit dem Empfangstimeout kann man Funktionsfehler und Netzwerkstörungen sicher erkennen.

Da man Firmata auch als I2C-Brücke verwenden kann, gibt es im gleichen Zusammenhang noch eine Erweiterung für I2C. Besteht beim Schreiben auf den I2C-Bus keine Netzwerkverbindung zum Firmata-Device wird nun ein Fehler zurückgemeldet, der vom jeweiligen I2C-Modul ausgewertet werden kann.



zu 3.) Standardisierung der 10/20_FRM-Module

Beim Testen der Änderungen von Punkt 1 sind viel kleine Unterschiede bei der Bedienung, des Fehlerverhaltens und des Loggings bei den 10/20_FRM_XXXXX-Modulen aufgefallen. Hier zumindest eine Teilstandardisierung umzusetzen, hat sich als relativ zeitaufwendig herausgestellt. Ziel war es u.a., dass die in FHEMWEB angezeigten Parameterfelder hinter get und set den tatsächlichen Anforderungen des jeweiligen Kommandos entsprechen, dass bei Ablauffehlern während get, set oder bei Attributänderung das STATE-Internal auf eine Fehlertext gesetzt wird, dass der Aufbau der Fehlertexte für den gleichen Ablauf gleich ist und dass bei get und set zumindest die Anzahl der Übergabeparameter überprüft werden.



Hier die Liste der wesentlichen Änderungen:

FRM

  • TCP/WiFi connected Firmata devices: TCP socket close detection improved, new attribute "receiveTimeout"
  • new attribute "ping-interval"
  • I2C: set inernal I2C SENDSTAT to error if sub I2CWrtFn is called while Firmata device is not connected and propagate error by synchronously calling sub I2CRecFn
  • added command "set sendString"
  • detect if Device::Firmata is installed and has required version, set FRM internal DRIVER_STATUS and FRM client internal IODev_ERROR on error
  • added support for client module I2C_INA219

alle 20_FRM_XXXXX.pm

  • check for IODev install error in Init, Get, Set, Attr and Undef
  • missing get/set argument metadata added
  • get/set argument verifier improved
  • moved define argument verification and decoding from Init to Define
  • error behaviour of Init, Get, Set and Attr standardized
  • annotaded module help of attributes for FHEMWEB

FRM_I2C

  • init register image before updating received bytes
  • moved receive processing from FRM module to FRM_I2C module
  • added I2C read function "get register"
  • added I2C write function "set register"
  • improve live modification of IODev
  • issue I2C stop reading command if device is initialized with zero byte count or is deleted

OWX_FRM

  • Update in Arbeit

OWX_ASYNC

  • Update unwahrscheinlich (kein aktiver Maintainer)

FRM_LCD

  • ist seit längerem abgekündigt und wird nun entfernt: bitte statt dessen das kompatible Modul I2C_LCD verwenden

Device::Firmata 0.69 (CPAN) im Vergleich zu 0.64 (FHEM)

  • fix push on reference in method "attach"
  • fix analog input pin operations in Device::Firmata::Platform
  • added method IO::SerialIO::close()

Grüße,
Jens



Edit 23.10.2020:

  • alle FRM-Module aktualisiert.
  • zu 1) 11_OWX_FRM.pm ist in Arbeit.
  • zu 2) Anders als zunächst angenommen wirken sich die beschriebenen Änderungen auch auf Firmata-1-Wire-Lösungen aus.
  • zu 2) weiteres neues Attribut "receiveTimeout".

Edit 25.11.2020:

  • 11_OWX_FRM.pm aktualisiert.

Edit 20.12.2020:

  • Perl-Modul Device::Firmata aus FHEM entfernt.
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

rudolfkoenig

ZitatIn Folge stürzt FHEM ab, wenn das Perl-Modul Device::Firmata aus dem FHEM-Unterverzeichnis gelöscht wird oder wenn man bei einer FHEM-Neuinstallation ein define für ein Firmata-Modul durchführt.
Kleine Korrektur: FHEM stuerzt nicht ab.
Falls man das Geraet neu definiert, dann wird "nur" die Meldung "Cannot load module FRM" ausgegeben, mit Details in FHEM Log (Can't locate Device/Firmata/...).
Falls man FHEM mit existierenden Definitionen in fhem.cfg startet, dann steht diese Meldung in der motd, was nach dem Start auf der FHEMWEB "Homepage" angezeigt wird, weiterhin wird ein von Modulen automatisch ausgeloestes save verhindert, damit die nicht akzeptierte Definition nicht automatisch aus der fhem.cfg entfernt wird.


jensb

Es gibt bei den bisherigen FRM-Modulen auch noch den Fall, dass das Define selbst funktioniert und erst etwas zeitversetzt der FRM-interne Client Init eine Perl-Exception auslöst, so dass ich FHEM neu starten musste, allerdings nicht zwingend im Zusammenhang mit einem fehlenden Device::Firmata.
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

Allgaeuer

Hallo Jens,

bei mir funktioniert alles. Ich verwende "AD", "PWM", "IN" und "OUT" . Auch das "Flackern" beim IPad ist weg, wenn ich das FRM-Device aufgerufen habe.

Ich habe die Module hier aus dem Post rüberkopiert. Wenn Du vielleicht noch die Kommandozeilen angibst, wie man die Module später direkt von Github installiert/updated, dann ist Deine Beschreibung perfekt.

Danke  :)

Gruß Allgäuer

jensb

Hallo Allgäuer,

danke für den Test und deine Rückmeldung.

Die Beta-Versionen der FRM-Module kann man prinzipiell auch von GitHub direkt installieren. Auf der Kommandozeile geht das ungefähr so (Beispiel für Rasbian):


mkdir beta
cd beta
git clone https://github.com/jnsbyr/fhem.git
cd fhem/FHEM
sudo cp -a 10_FRM.pm <FHEM Installationsverzeichnis>/FHEM
sudo cp -a 20_FRM*.pm <FHEM Installationsverzeichnis>/FHEM
sudo chmod fhem:dialout <FHEM Installationsverzeichnis>/FHEM/*FRM*
cd ../..
rm -r beta


Wie man Device::Firmata über die Kommandozeile installiert, steht ja bereits im 1. Post (sudo cpan install Device::Firmata ...).

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

Hallo Jens,

danke, dass du die Module weiterentwickelst! Auch den Wechsel der Firmata-Ressorcen zu den offiziellen Quellen finde ich gut.
Sobald die OWX verfügbar ist, werde ich FRM umstellen. Bis dahin verzichte ich auf updates.

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.

Prof. Dr. Peter Henning


jensb

#7
Die neuen Versionen der Module 10_FRM.pm und 20_FRM_*.pm sind eingecheckt und ab 31.10.2020 per FHEM Update verfügbar.

Außerdem wurde das Modul 20_FRM_LCD.pm nach contrib/deprecated verschoben - bitte statt dessen das Modul 52_I2C_LCD.pm verwenden.

Auch der Wiki-Artikel über Firmata ist nun aktualisiert.

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

golem

Hallo,
Bie mir erscheint bei meinen Eingängen die Meldung
Perl module Device::Firmata not properly installed.
Die Fimata Module habe die ich wie in Wiki beschrieben mit
sudo cpan install Device::Firmata
Installiert und im Fhem Verzeichnisse gelöscht. Hat Jemand noch eine Idee?

Gruß Denis
Pi - Max-Lan - 8x max Ht -3x Max WT - Max Fk -modbus umg103- 2x Arduino mit Firmata Ethernet- ws300 - 433Mhz Sender Empfänger - 7x 1wire ds1820

jensb

Hallo Denis,

wechsle zum IODev, also zu deinem FRM-Modul und schau dir an, ob es das Internal DRIVER_STATUS gibt und wenn ja, was da für eine Meldung steht.

DRIVER_STATUS soll helfen, die eigentliche Ursache zu finden. Es könnte z.B. sein, dass du die "alte" FHEM-Variante aus dem Unterverzeichnis FHEM\lib\Device nicht gelöscht hast (siehe dazu auch die Deinstallationsanleitung aus dem 1. Post dieses Threads). Aktuell liefert das FHEM-Update leider noch die alte Version, da die Umstellung von OWX nicht abgeschlossen ist.

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

golem

Hi Jens,

Das internal DRIVER_STATUS ist nicht vorhanden. Muß ich die das Modul wohl nochmal austauschen oder?
Pi - Max-Lan - 8x max Ht -3x Max WT - Max Fk -modbus umg103- 2x Arduino mit Firmata Ethernet- ws300 - 433Mhz Sender Empfänger - 7x 1wire ds1820

jensb

Hallo Denis,

das Internal DRIVER_STATUS gibt es nur, wenn das FRM-Modul ein Problem festgestellt hat. Daher vermute ich, dass sich die Devices den Zustand gemerkt haben, wo es noch nicht gepasst hat.

Bitte prüfe, ob die Devices, bei denen die Meldung "Perl module Device::Firmata not properly installed" erscheint, das Internal IODev_ERROR=1 haben. Sollte das der Fall sein, dann solltest du FHEM einmal neu starten. Dadurch werden alle Internals gelöscht. Wenn das Internal nach dem Neustart weg ist, dann müsste auch die Fehlermeldung weg sein und dann haben wir den Grund.

Ist der Fall aber bei dir anders, dann bitte einmal die Ausgabe des Kommandos list für das FRM-Device und eines der Client-Devices mit der Meldung posten, sowie die Rev der beiden Module aus der Ausgabe des Kommandos version.

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

golem

Hallo Jens,

Internals:
   DEF        /dev/serial/by-id/usb-Arduino__www.arduino.cc__Arduino_Uno_6493534313335141C261-if00@57600
   DeviceName /dev/serial/by-id/usb-Arduino__www.arduino.cc__Arduino_Uno_6493534313335141C261-if00@57600
   FD         62
   FUUID      5c77ca64-f33f-dec7-5fed-b2c85630156b6931
   LAST_RECEIVED 2020-11-24 21:43:30
   NAME       firmata
   NOTIFYDEV  global
   NR         380
   NTFY_ORDER 50-firmata
   PARTIAL   
   STATE      Initialized
   TYPE       FRM
   analog_pins 14,15,16,17,18,19
   analog_resolutions 14:10,15:10,16:10,17:10,18:10,19:10
   encoder_pins 2,3
   encoder_resolutions 2:28,3:28
   firmware   ConfigurableFirmata.ino
   firmware_version V_2_06
   i2c_pins   18,19
   input_pins 2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19
   onewire_pins 2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19
   output_pins 2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19
   protocol_version V_2_06
   pwm_pins   3,5,6,9,10,11
   pwm_resolutions 3:8,5:8,6:8,9:8,10:8,11:8
   servo_pins 2,3,4,5,6,7,8,9,10,11,12,13
   servo_resolutions 2:14,3:14,4:14,5:14,6:14,7:14,8:14,9:14,10:14,11:14,12:14,13:14
   stepper_pins 2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19
   stepper_resolutions 2:21,3:21,4:21,5:21,6:21,7:21,8:21,9:21,10:21,11:21,12:21,13:21,14:21,15:21,16:21,17:21,18:21,19:21
   READINGS:
     2020-11-24 21:42:04   state           Initialized
   SERIAL:
Attributes:
   i2c-config 1
   room       Geräte
   verbose    3

Internals:
   DEF        3
   FUUID      5c77c9fd-f33f-dec7-31b7-8ed9c67e00a09d54
   IODev      firmata
   IODev_ERROR 1
   NAME       in_gaszaehler
   NR         158
   STATE      on
   TYPE       FRM_IN
   READINGS:
     2020-11-06 11:41:45   reading         on
     2020-11-24 21:42:04   state           error: Perl module Device::Firmata not properly installed
Attributes:
   IODev      firmata
   activeLow  yes
   comment    Bei einer großen Leitungslänge eines Arduino eingangs ist der Interne Pullup zu hoch. ein Externe 1KOhm Wiederstand ist hier besser.
   group      Gas
   internal-pullup off
   room       Heizung,Keller
   stateFormat reading

10_FRM.pm              23052 2020-10-30 17:48:53Z jensb
20_FRM_IN.pm           23054 2020-10-30 18:16:24Z jensb

OneWire und I2C funktionieren mit dem Firmata Device
Pi - Max-Lan - 8x max Ht -3x Max WT - Max Fk -modbus umg103- 2x Arduino mit Firmata Ethernet- ws300 - 433Mhz Sender Empfänger - 7x 1wire ds1820

Prof. Dr. Peter Henning

OK, ich habe beim Test keine Fehler in den Änderungsvorschlägen von Jens gefunden und soeben 11_OWX_FRM eingecheckt.

LG

pah

jensb

Hallo Denis,

die Versionen passen.

ZitatOneWire und I2C funktionieren mit dem Firmata Device
Das ist prima und auch plausibel, denn die bisherigen OneWire-Modul-Versionen und alle I2C-Module überprüfen die Firmata-Version und deren Kompatibilität nicht, das machen nur die "neuen" FRM-Module.

Zitat... dann solltest du FHEM einmal neu starten.
Hast du das ausprobiert, bevor du die list-Kommandos ausgeführt hast?

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