Projekt: Firmata mit ATmega1284P und DS2480 Busmaster für Hutschienengehäuse

Begonnen von Tom Major, 12 Januar 2015, 19:55:45

Vorheriges Thema - Nächstes Thema

Tom Major

Hi,

Ich möchte gern für das Projekt im Titel die bestehende Arduino Firmata in 2 Aspekten erweitern:

a) HW/SW Arduino

einen ATmega1284P als leistungsfähigeren Arduino mit mehr Ressourcen, vor allem RAM und Flash gegenüber dem Uno, siehe
https://maniacbug.wordpress.com/2011/11/27/arduino-on-atmega1284p-4/

Dieser System läuft bereits bei mir prototypisch mit einer leicht angepassten conf. Firmata und der UIPEthernet mit ENC28J60, dank Norberts Arbeiten auf diesem Gebiet.

Ich plane für dieses System eine Platine für ein Hutschienengehäuse mit Digital IO (In Opptokoppler, Out Buffered) sowie vor allem einem DS2480 Busmaster für Onewire.
Der DS2480 hat gegenüber dem DS2482 und vor allem gegenüber dem direkten Anschluss von OneWire Devices am Arduino den Vorteil einer größeren Robustheit des Buses und längerer möglicher Leitungen. Der 1284P hätte auch eine 2. serielle Schnittstelle dafür. Die Wandlung der Temperaturen soll im Background erfolgen und Fhem/Firmata nicht belasten.

b) SW Fhem

Ich hätte gern in Fhem ein generisches Device für Sensorwerte, also z.B. für die oben angesprochenen Temperaturen aus der Wandlung im Hintergrund, aber auch für andere Erweiterungen.

Also etwas in der Art
define <name> FRM_GENERIC <id>
mit der id sollen dann von Firmata Seite reports gesendet werden und in Fhem in einem log landen.

Mein Problem liegt auf Fhem Seite und Perl, die ganze Sache im Fhem code sieht relativ komplex aus und übersteigt meine kaum vorhandenen Perl Kenntnisse, und ich habe momentan leider wenig Zeit mich in Perl einzuarbeiten.

Ich könnte mich komplett um das Hardwaredesign und die Firmata Erweiterung auf ATmega Seite kümmern und wollte bei Norbert anfragen, ob so ein FRM_GENERIC Modul für Fhem testweise implementiert werden könnte?

Falls das so funktioniert wie gedacht würde natürlich bei Interesse das Hardwaredesign der Platine für die Hutschiene und die Firmata Erweiterung der Fhem Community verfügbar gemacht.

Danke & Grüße,
Tom
Früher: FHEM 5.x
Jetzt: RaspberryMatic / ioBroker

matthias soll

Hallo Tom,

ich habe einen Arduino Mega 2560 mit firmata, ENC28J60, 54 ausgängen und einem definierten onewire pin bei mir seit ca. 5 Monaten laufen.
Ich habe an den ausgängen optokoppler mit treibern die mir im ganzen Haus verteilte Relais schalten.

Allerdings steigt der Arduino ca. alle 4 tage aus und ich muss ihn kurz von Strohm nehmen (neu booten) das nervt ein wenig.
Ich überlege ob ein richtiges ethernet shield mit w5100 stabiler laufen würde.

Hast du oder jemand eine idee warum sich firmata manchmal aufhängt? Im log ist nichts zu finden.
Gruß
Matthias

Tom Major

Hallo Matthias,

witzigerweise habe ich in den letzten Tagen auch ein paar Firmata Stabilitätstests gemacht und habe ein Reconnect Problem, bin aber nicht sicher ob das dasselbe wie bei Dir ist.
Ich will später den Arduino u.a. im Keller einsetzen, und da wären z.B. 4 Tage wie bei Dir nicht akzeptabel.

Mein Reconnect Problem ist folgendes: Wenn ich vom Host ein Testprogramm starte (momentan Perl Device::Firmata, blink example auf Ethernet umgestellt) und dann dort mit Ctrl-C beende, merkt Firmata nie das der Host nicht mehr da ist. Das ist laut Norbert per Design so bei TCP
https://github.com/ntruchsess/arduino_uip/issues/65
Dennoch macht das natürlich im konkreten Fall Probleme, denn wenn ich dann das blink Programm wieder starte, bekomme ich nie ein connect (da Firmata sich immer noch connected glaubt).

Ich habe daraufhin das EthernetClientStream Modul in der Firmata etwas überarbeitet, so das dieses ein Reset macht, wenn für bestimmte Zeit keine Daten vom Host kommen. Dafür muss aber Fhem zyklisch senden, das habe ich momentan so gelöst, das dort zyklisch ein Dummy Pin an Arduino alle 60sec getoggelt wird:
define at1 at +*00:02:00 set OutputB0 on-for-timer 60

In der Firmata wird jetzt nach 2 min Stille vom Host ein Reset ausgelöst, momentan löst das mein Reconnect Problem zuverlässig. Eventuell wäre das auch ein Workaround für Dich.

Ansonsten kann ich ausserdem nur empfehlen, zu prüfen ob Du die neuste UIP_Ethernet einsetzt, da es dort im Herbst 2014 einige Fixes bezüglich Bugs im ENC28J60 chip gab.

Grüße Tom
Früher: FHEM 5.x
Jetzt: RaspberryMatic / ioBroker

matthias soll

Hallo Tom,

der Workaround klingt gut, kannst du mal zeigen was du arduinoseitig wo geändert hast?

Ich habe Probeme, dass er manchmal nicht erreichbar ist und manchmal zufällig mehrere ausgänge schaltet.
Weis irgendjemand wodurch die Firmata Probleme kommen?

Gruß
Matthias

Tom Major

Hallo Matthias,

habe noch ein paar Tests gemacht, mein Reconnect Problem ist erstmal behoben. Folgende Änderungen:

EthernetClientStream.h
in der Klasse 3 neue Methoden bzw. Member hinzufügen:
public:
  uint32_t lastReadTime() { return time_lastread; }
  bool isConnected() { return connected; }
private:
  uint32_t time_lastread;

EthernetClientStream.cpp
nur 2 neue Zeilen:

EthernetClientStream::read()
{
  time_lastread = millis();      //neu
  return maintain() ? client.read() : -1;
}

EthernetClientStream::maintain()
{
...
      connected = host ? client.connect(host,port) : client.connect(ip,port);
      time_lastread = millis();    //neu
      if (!connected)
        time_connect = millis();
...

OK, und dann im Configurable sketch, ganz am Ende von void loop()

  static bool resetActive = false;
  if ( (stream.isConnected()) && (millis()-stream.lastReadTime() >= 120000) && (!resetActive) ) {   // 2min
      resetActive = true;
     Serial.print("read timeout"); Serial.println();
     Firmata.sendString("Host read timeout, reseting Firmata");
      wdt_enable(WDTO_500MS);
  }
}   // hier ist loop() zuende

ich habe das nach "oben" hin durchgezogen, damit ich flexibler im Sketch bin, für ev. Erweiterungen. Ansonsten hätte man auch alles nur in EthernetClientStream machen können.

Und dann wie gesagt im Fhem der zyklische Toggle Befehl jede Minute von weiter oben.
Bei mir funktioniert das bisher recht sauber mit dem Reset, falls sich Fhem nicht aller 2 min. meldet. Timing kann man natürlich anpassen.

Bei einem Reset der Firmata bekommt man einen Eintrag ins lofgile:
"received String_data: Host read timeout, reseting Firmata"

Damit könntest Du schauen, ob das Dein 4 Tage Problem löst.

Grüße Tom

Früher: FHEM 5.x
Jetzt: RaspberryMatic / ioBroker

matthias soll

Hallo Tom,
danke erstmal für die codebeispiele.
Aktuell mache ich nachts per Zeitschaltuhr einen reboot und habe onewire ausgeschaltet jetzt läuft es stabiler.
Ich möchte als nächstes erstmal auf w5100 ethernet shield umrüsten und hoffe dass es damit stabiler läuft.
Gruß
Matthias

Tom Major

Hallo Matthias,

das bleibt natürlich Dir überlassen auf welchem Weg Du das Problem angehts. Ich finde die Firmata mit der ENC28J60 eine gute und kostengünstige Lösung.

Ich an Deiner Stelle würde erstmal das Reset bei Timeout testen, das sind max. 5 min Änderungsaufwand, ehe ich mit Zeitschaltuhr und neuem Ethernetschild hantieren würde. Ev. ist es nur eine Kleinigkeit...

Grüße Tom
Früher: FHEM 5.x
Jetzt: RaspberryMatic / ioBroker