Firmata Update für Firmware-Versionen ab 2.7

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

Vorheriges Thema - Nächstes Thema

ntruchsess

Zitat von: jensb am 03 Februar 2018, 21:43:56Ich habe mehr als 1 Jahr lang versucht, über PM, GitHub und über Rudi Kontakt mit Norbert aufzunehmen, aber leider ohne Erfolg. Es ist wirklich nicht mein Ding, die Projekte anderer Entwickler ohne explizites Einverständnis auch nur vorübergehend zu übernehmen.

Hallo Jens,

ich hab tatsächlich schon gefühlt ewig nicht mehr hier reingeschaut, mein FHEM läuft seit Jahren unverändert und stabil und ich arbeite mittlerweile an ganz anderen Baustellen. Meine FHEM-module (und auch aller andere Code den ich im vergangenen Jahrzehnt open source veröffendlich habe) darf gerne jeder, der sich berufen fühlt weiterentwickeln, dafür brauchts meine explizite Erlaubnis nicht, dafür sind die jeweiligen Lizenzen ja offen genug.

Das perl-firmate-repository auf github kann ich Dir gerne ganz übertragen, wenn Du magst. Wie man auf CPAN die modul-ownship überträgt weiß ich leider nicht, würde mich aber auch freuen, wenn das jemand wie z.B. Du aktiv weiterführt.

Gruß,

Norbert
while (!asleep()) {sheep++};

jensb

Hallo Nobert,

freut mich wirklich sehr, dass du dich meldest. Hatte lange gehofft, dass das doch passiert.

Hatte mich zunächst nur mit Hinweisen in den Foren beteiligt, da die Probleme mit den aktuellen Firmata-Versionen zugenommen hatten. Als dann Hinweise zum Selbstpatchen der Firmata-Module in der FHEM-Wiki auftauchten, habe ich das nicht mehr mit ansehen können und meine eigenen Patches als Updates zur Verfügung gestellt. Danke, dass du damit kein Problem hast.

Eine Übertragung der Repositories ist mir nicht wichtig. Auf GitHub hattest du mich ja schon zum Mitentwickler gemacht, so dass ich Updates einchecken kann, wenn das erforderlich ist. Wie das mit CPAN funktioniert steht hier. Ich werde mich als Perl-Entwickler registrieren und dann könntest du mich als Co-Maintainer eintragen. Die Details können wir per PM klären.

Viel Erfolg bei deinen "anderen Baustellen",
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

ntruchsess

prima. Freut mich wirklich, dass Du das weiterführst! Gib Bescheid, wenn Du auf CPAN registriert bist, dann trage ich Dich da als Co-maintainer ein.

Gruß,

Norbert
while (!asleep()) {sheep++};

ffdec

Grad noch mal die Firmata FW auf 2.10 aktualisiert. Dennoch bleiben die Fehler, die schon sehr lange immer wieder beim Start kommen:
Wäre cool wenn wir das lösen können.

2018.03.14 20:51:31.786 1: OWX_FRM::Define warning: version 7.10 not identical to OWX version 7.08
2018.03.14 20:51:36.254 1: PERL WARNING: Use of uninitialized value in numeric comparison (<=>) at fhem.pl line 2055, <$fh> line 674.
2018.03.14 20:51:36.258 1: PERL WARNING: Use of uninitialized value in numeric comparison (<=>) at fhem.pl line 2055, <$fh> line 681.
2018.03.14 20:51:36.262 1: PERL WARNING: Use of uninitialized value in numeric comparison (<=>) at fhem.pl line 2055, <$fh> line 688.
2018.03.14 20:51:36.266 1: PERL WARNING: Use of uninitialized value in numeric comparison (<=>) at fhem.pl line 2055, <$fh> line 695.
2018.03.14 20:51:36.270 1: PERL WARNING: Use of uninitialized value in numeric comparison (<=>) at fhem.pl line 2055, <$fh> line 702.
2018.03.14 20:51:36.278 1: PERL WARNING: Use of uninitialized value in numeric comparison (<=>) at fhem.pl line 2055, <$fh> line 710.
2018.03.14 20:51:36.656 1: PERL WARNING: Use of uninitialized value in numeric comparison (<=>) at fhem.pl line 2055, <$fh> line 875.
2018.03.14 20:51:36.805 1: PERL WARNING: Use of uninitialized value in numeric comparison (<=>) at fhem.pl line 2055, <$fh> line 971.
2018.03.14 20:51:36.829 1: Including ./log/fhem.save
2018.03.14 20:51:37.054 1: Error: >OWX:6< has no TYPE, but following keys: ><
2018.03.14 20:51:37.619 1: usb create starting
2018.03.14 20:51:38.152 1: usb create end
2018.03.14 20:51:38.153 0: Featurelevel: 5.8
2018.03.14 20:51:38.154 0: Server started with 133 defined entities (fhem.pl:16403/2018-03-13 perl:5.024001 os:linux user:fhem pid:13275)
2018.03.14 20:51:39.275 1: HMLAN_Parse: LAN new condition ok
2018.03.14 20:51:42.484 1: PERL WARNING: Use of uninitialized value in concatenation (.) or string at ./FHEM/10_FRM.pm line 1051.
2018.03.14 20:51:52.991 1: OWX_Discover: 1-Wire devices found on bus DS18B20 (WWAuslauf,Ruecklauf,WWVorl,WWZP,Vorlauf)
2018.03.14 20:52:31.788 1: OWX_Init called for bus DS18B20 with interface state Initialized, now going for detect
2018.03.14 20:52:31.788 1: OWX: 1-Wire bus DS18B20: interface Firmata detected in Firm
2018.03.14 20:52:31.871 1: OWX_Discover: 1-Wire devices found on bus DS18B20 (WWAuslauf,Ruecklauf,WWVorl,WWZP,Vorlauf)


2018.03.14 20:51:37.054 1: Error: >OWX:6< has no TYPE, but following keys: >< Da kann man anstatt der Firmata irgend etwas reinschreiben. Also nicht wundern, wenn da OWX steht.
HMUARTLGW HMLAN Alarmanlage ZPumpe VCONTROL Viessmann 333-F MySensors CO2 Floorplan IT Raspberry 3 CC1101 Firmata Arduino nanoCUL868

jensb

@ffdec
Die Fehlermeldung kommt aus dem FHEM-Kern und zwar aus der Unterfunktion devspec2array. Die wird allerdings aus sehr vielen verschiedenen Abläufen heraus aufgerufen. Aufgrund des Loggings tippe ich auf das Wiederherstellen der gespeicherten Readings.

Ich kenne diese Fehlermeldung auch, hatte aber bisher nicht das Bedürfnis, der Sache nachzugehen. Werde mir das ansehen, das kann aber etwas dauern.

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

ffdec

@jensb: Ah super, vielen Dank. Das reicht mir.
HMUARTLGW HMLAN Alarmanlage ZPumpe VCONTROL Viessmann 333-F MySensors CO2 Floorplan IT Raspberry 3 CC1101 Firmata Arduino nanoCUL868

jensb

Zwischenstand: Die von @ffdec gemeldete Warning
PERL WARNING: Use of uninitialized value in numeric comparison (<=>) at fhem.pl line 2055
hat nichts mit Firmata zu tun, siehe hier.

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

Das gleicht gilt für
Error: >OWX:6< has no TYPE, but following keys: ><
siehe hier.

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

FhemPiUser

#113
Hallo Jens,

erstmal vielen Dank, dass Du die Wartung der Module übernommen hast und auch offen für Feature-Wünsche bist!

Ich hätte da nämlich einen Feature-Wunsch: eine Keep-Alive-Option mit Callback-Funktion.

Hintergrund:

Ich steuere meine Heizung über einen Arduino, der über Firmata über Ethernet (FRM device) an FHEM angebunden ist. Läuft an sich sehr stabil, aber ich hatte es in den letzten 3 Jahren glaube ich 2 Mal, dass FHEM bzw. der Raspberry aus irgendeinem Grund in der Nacht stehen blieb und daher morgens die Heizung nicht angeschaltet wurde. War nicht gut...

Daher wäre mein Wunsch, dass es eine Option gibt, dass FHEM bzw. das FRM device periodisch Keep-Alive-Nachrichten über Firmata Ethernet an den Arduino sendet. Wenn diese z.B. 2-3 Mal nicht mehr ankommen (z.B. weil FHEM bzw. der Raspberry ausgefallen ist), dann soll auf dem Arduino eine "Keep-Alive-Missing"-Callback-Funktion aufgerufen werden können. Diese würde in meinem Fall dann in den "Heizungs-Notfall-Modus" schalten und die Heizung anschalten. Wenn die Keep-Alive-Nachrichten wieder ankommen, würde eine "Keep-Alive-back"-Callback-Funktion aufgerufen werden, die die Heizung wieder in den Regelmodus von FHEM schaltet.

Was hälst Du davon? Wäre das möglich?

Vielen Dank

jensb

#114
Hallo FhemPiUser,

wenn ich dich richtig versehe, meinst du mit Keep-Alive nicht die TCP Socket Option sondern eine Art Watchdog-Telegramm. Nun, Firmata ist keine FHEM-Anwendung sondern ein standardisiertes Protokoll und eine Protokollerweiterung müsste man hier beantragen und abwarten, was entschieden wird. Das wird in diesem Fall nicht nötig sein, hier reichen Arduino Bordmittel.

Mein Vorschlag: Verwende einen realen Digitalausgang ohne externe Beschaltung am Arduino und toggle ihn von FHEM aus periodisch mit "at" z.B. alle 10 Sekunden. Überwache das Toggeln in der Firmata loop, indem du den letzten Zustand und den Zeitpunkt der letzten Zustandsänderung in 2 Variablen zwischenspeicherst. Daraus kannst du deinen Notfall-Modus nach einem frei wählbaren Timeout auslösen.

In Gegenrichtung ist es fast genauso einfach. Füge in die Firmata loop folgendes ein:

  if (client.connected() && (currentMillis - pingSent) >= PING_PERIOD)
  {
    // send some data to detect loss of connection indirectly
    Firmata.sendString("ping");
    pingSent = currentMillis;
  }


definiere noch irgendwo weiter oben im Code "#define PING_PERIOD 60000 // [ms]" sowie "unsigned long pingSent = 0;" und setzte in deinem FRM-Device das Attribut "errorExclude" auf "ping". Anschließend kannst du das Reading "stringMessage" des FRM-Device überwachen. Im Gutfall sollte regelmäßig den Wert "ping" aktualisiert werden.

Für deinen Notfall-Modus könntest du "!client.connected()" zusätzlich mit auswerten.

Diese Funktionen in FHEM zu integrieren geht also nicht. Die wesentlichen Änderungen müssen in der Firmata-Firmware durchgeführt werden und das ist durchaus im Sinne des Erfinders.

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

FhemPiUser

Hi Jens,

ok, stimmt, gute Idee mit dem toogle. Darauf bin ich nicht gekommen...

Vielen Dank!

FhemPiUser

#116
...falls es jemand anders benötigt anbei der Code für die keep alive Erweiterung der Arduino StandardFirmataEthernet inkl. Notfallmodus und -recovery:

Definitionen:
// KEEPALIVE START
#define KEEPALIVE_PERIOD 300000 // [ms] =5min
#define PIN_KEEPALIVE_LISTEN 6
#define PIN_SET_IN_EMERGENCY_1 7
#define PIN_SET_IN_EMERGENCY_2 8
// KEEPALIVE END


Globale Variablen:
// KEEPALIVE START
unsigned long previousKeepaliveMillis = 0;        // store the current value from millis()
int missingKeepaliveMsgs = 0;
int lastKeepalivePinState = 0;
byte keepaliveEmergencyMode = 0;
int pinState1;
int pinState2;
// KEEPALIVE END


Code hinzugefügt am Ende von loop():
 
// KEEPALIVE START
  if (lastKeepalivePinState != digitalRead(PIN_KEEPALIVE_LISTEN)) {
    previousKeepaliveMillis = currentMillis;
  lastKeepalivePinState = digitalRead(PIN_KEEPALIVE_LISTEN);
  if (keepaliveEmergencyMode > 0) {
    // leaving emergency mode
  // restore pin states
  //digitalWrite(PIN_SET_IN_EMERGENCY_1, pinState1); 
  //digitalWrite(PIN_SET_IN_EMERGENCY_2, pinState2); 
  // inform fhem about emergency mode
  keepaliveEmergencyMode = 0;
      Firmata.sendString("Keepalive: Leaving emegency mode!");
  }
  }
  if (((currentMillis - previousKeepaliveMillis) > (KEEPALIVE_PERIOD + 60000)) && (keepaliveEmergencyMode == 0)) {
  missingKeepaliveMsgs++;
    Firmata.sendString("Keepalive: Keepalive message missing.");
  }
  if (((currentMillis - previousKeepaliveMillis) > (3*KEEPALIVE_PERIOD + 60000)) && (keepaliveEmergencyMode == 0)) {
    // starting emergency mode
  // store pinstates
          pinState1 = digitalRead(PIN_SET_IN_EMERGENCY_1);
  pinState2 = digitalRead(PIN_SET_IN_EMERGENCY_2);
  keepaliveEmergencyMode = 1;
  digitalWrite(PIN_SET_IN_EMERGENCY_1, LOW);
  digitalWrite(PIN_SET_IN_EMERGENCY_2, LOW);
    Firmata.sendString("Keepalive: Starting emegency mode!");
  }
  // KEEPALIVE END


...und in fhem das periodische Setzen eines Keepalive FRM_OUT devices:

defmod Arduino_Heizung_Keepalive FRM_OUT 6
defmod at_Arduino_Heizung_Keepalive at +*00:05:00 set Arduino_Heizung_Keepalive toggle

jensb

Wer Firmata verwendet und sich vor Fehlkonfgurationen durch den Host schützen möchte (z.B. fest verdrahteter Eingang wird unbeabsichtigt auf Ausgang gesetzt), kann noch einen Schritt weiter gehen:

void setPinModeCallback(byte pin, int mode)
{
  if (Firmata.getPinMode(pin) == PIN_MODE_IGNORE)
    return;

  // fixed digital inputs
  if (pin == MY_PULLUP_PIN && mode != PIN_MODE_PULLUP)
    return;

  // fixed digital outputs
  if (pin == MY_OUTPUT_PIN && mode != OUTPUT)
    return;

  ...
}


Will man die Hardwarekonfiguration auch nutzen, wenn nach dem Boot des Arduino noch kein Host-Connect zu Stande gekommen ist, dann hilft folgendes (immer mit obiger Fehlkonfigurationsblockade kombinieren):

void setup()
{
  ...

  initFirmata();

  // fixed digital inputs
  pinMode(PIN_TO_DIGITAL(MY_PULLUP_PIN), INPUT_PULLUP);
 
  // fixed digital outputs
  pinMode(PIN_TO_DIGITAL(MY_OUTPUT_PIN ), OUTPUT); 
  digitalWrite(PIN_TO_DIGITAL(MY_OUTPUT_PIN ), LOW); // initial state after boot/reset
}


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

hugo.crank

Hallo,
da ich hin und wieder den leidigen Zustand habe das mir 2 Arduinos stecken bleiben hab ich bei meiner suche dieses Thema gefunden. Gehe ich richtig davon aus das ich mit der nachfolgenden Funktion "Emergencymode" den arduino dazu bewegen kann das er neustartet einen "Reset" durchführt wenn er keinee positive Rückmeldung von Fhem erhält?
Zustand ist im Moment der das der betreffende Arduino als "Online" gezeigt wird bei mir in der Fheminstanz pingbar sowie connected. aber nicht mehr ansprechbar ist da sich Fhem mit befehlen verrennt.




Zitat von: FhemPiUser am 25 März 2018, 19:39:56
...falls es jemand anders benötigt anbei der Code für die keep alive Erweiterung der Arduino StandardFirmataEthernet inkl. Notfallmodus und -recovery:

Definitionen:
// KEEPALIVE START
#define KEEPALIVE_PERIOD 300000 // [ms] =5min
#define PIN_KEEPALIVE_LISTEN 6
#define PIN_SET_IN_EMERGENCY_1 7
#define PIN_SET_IN_EMERGENCY_2 8
// KEEPALIVE END


Globale Variablen:
// KEEPALIVE START
unsigned long previousKeepaliveMillis = 0;        // store the current value from millis()
int missingKeepaliveMsgs = 0;
int lastKeepalivePinState = 0;
byte keepaliveEmergencyMode = 0;
int pinState1;
int pinState2;
// KEEPALIVE END


Code hinzugefügt am Ende von loop():
 
// KEEPALIVE START
  if (lastKeepalivePinState != digitalRead(PIN_KEEPALIVE_LISTEN)) {
    previousKeepaliveMillis = currentMillis;
  lastKeepalivePinState = digitalRead(PIN_KEEPALIVE_LISTEN);
  if (keepaliveEmergencyMode > 0) {
    // leaving emergency mode
  // restore pin states
  //digitalWrite(PIN_SET_IN_EMERGENCY_1, pinState1); 
  //digitalWrite(PIN_SET_IN_EMERGENCY_2, pinState2); 
  // inform fhem about emergency mode
  keepaliveEmergencyMode = 0;
      Firmata.sendString("Keepalive: Leaving emegency mode!");
  }
  }
  if (((currentMillis - previousKeepaliveMillis) > (KEEPALIVE_PERIOD + 60000)) && (keepaliveEmergencyMode == 0)) {
  missingKeepaliveMsgs++;
    Firmata.sendString("Keepalive: Keepalive message missing.");
  }
  if (((currentMillis - previousKeepaliveMillis) > (3*KEEPALIVE_PERIOD + 60000)) && (keepaliveEmergencyMode == 0)) {
    // starting emergency mode
  // store pinstates
          pinState1 = digitalRead(PIN_SET_IN_EMERGENCY_1);
  pinState2 = digitalRead(PIN_SET_IN_EMERGENCY_2);
  keepaliveEmergencyMode = 1;
  digitalWrite(PIN_SET_IN_EMERGENCY_1, LOW);
  digitalWrite(PIN_SET_IN_EMERGENCY_2, LOW);
    Firmata.sendString("Keepalive: Starting emegency mode!");
  }
  // KEEPALIVE END


...und in fhem das periodische Setzen eines Keepalive FRM_OUT devices:

defmod Arduino_Heizung_Keepalive FRM_OUT 6
defmod at_Arduino_Heizung_Keepalive at +*00:05:00 set Arduino_Heizung_Keepalive toggle


FhemPiUser

hallo hugo.crank,

im code wird im emergency mode ein digitalwrite ausgeführt (Ausgang auf low, bedeutet bei mir heizung an). das könntest du aber durch deinen code ersetzen, z.b zum reset des arduino...