FHEM - Hausautomations-Systeme > Sonstige Systeme

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

(1/7) > >>

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:


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

--- Ende Code ---

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.:


--- Code: ---#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;
  }

  ...
}

--- Ende Code ---

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.

rudolfkoenig:

--- Zitat ---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.
--- Ende Zitat ---
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.

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):


--- Code: ---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

--- Ende Code ---

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

Grüße,
Jens

Navigation

[0] Themen-Index

[#] Nächste Seite

Zur normalen Ansicht wechseln