FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: bugster_de am 27 Juni 2014, 13:26:45

Titel: Arduino Ethernet - Probleme und Erfahrungen
Beitrag von: bugster_de am 27 Juni 2014, 13:26:45
Hallo Leute,

ich habe einen Arduino Mega mit einem Ethernet Shield bei mir im Technikraum installiert. Dieser soll verschiedenste Relais schalten und Sensoren auswerten. Die SW auf dem Arduino habe ich selbst geschrieben, da der Arduino eine kleine Menge eigener Intelligenz besitzen soll um z.B. bei Ausfall des Ethernet die verschiedensten relais wieder in einen sicheren Betriebszustand zu bringen.
Das klappt soweit auch, allerdings nur eine zeitlang dann steht der Arduino.

Die Zeit bis zum Stillstand hängt von der Menge an Anfragen ab: sprich wenn ich den Arduino zu testzwecken mal von FHEM aus vollballere (ein request jagt dan anderen), dann läuft er maximal 30 Minuten. Wenn ich nur ca. alle paar minuten mal was möchte, dann läuft er maximal 24 Stunden.

Zuerst habe ich den Fehler in meiner Software gesucht, aber irgendwann war ich mir sicher, dass die SW richtig ist. Nach langem lesen in verschiedenstan Foren würde ich nun behaupten, dass der Ethernetstack in der Arduino Library Bugs hat und er den Lese / Empfangspuffer im Ethernetshield wahllos überschreibt. Aber so recht konnte ich keine klare Lösung aus den Arduino Foren extrahieren.

Deshalb Frage an euch: kennt jemand das Problem? Gibt es eine einfache, nachvollziehbare Lösung?
Titel: Antw:Arduino Ethernet - Probleme und Erfahrungen
Beitrag von: Thorsten Pferdekaemper am 27 Juni 2014, 15:29:43
Hi,
ich mache etwas ähnliches, nur mit einem Arduino Uno. Das läuft jetzt ohne Ausfälle seit Januar mehr oder weniger am Stück.
Bist Du Dir ganz sicher, dass Du nicht doch irgendwo selbst ein Memory Leak produzierst? Um so etwas zu vermeiden, habe ich die folgende Funktion im Sketch:


int freeRam ()
{
  extern int __heap_start, *__brkval;
  int v;
  return (int) &v - (__brkval == 0 ? (int) &__heap_start : (int) __brkval);
};

Das Ergebnis davon kann ich per HTTP abfragen, so kann ich sehen, wenn irgendwo Speicher nicht freigegeben wird.

Gruß,
   Thorsten
Titel: Antw:Arduino Ethernet - Probleme und Erfahrungen
Beitrag von: bugster_de am 29 Juni 2014, 09:21:21
Hi,

Danke für deine Antwort. Bei Speicherlöchern bin ich mir ziemlich sicher (aber halt nur ziemlich). Ich habe jetzt schon alle Variablen statisch und global angelegt; sogar die i in den for Schleifen. Deine Funktion baue ich aber gleich mal ein, um zu sehen, ob da doch noch etwas ist. Ich werde berichten, wie das Ergebnis so ist.

Viele Grüße
Titel: Antw:Arduino Ethernet - Probleme und Erfahrungen
Beitrag von: bugster_de am 29 Juni 2014, 11:10:15
kleiner Zwischenstand nach mehr als 1h: läuft auch bei vollem 'Beschuß' noch. Bisher war bei voller Last nach max. 30 Minuten Schluß.

Memory Leak:
deine Funktion bringt mir immer die gleiche Zahl zurück. Ich vermute mal, dass das ein gutes Zeichen ist, da sie sich nicht verändert. Sprich der freie Speicher ist immer gleich.

Ethernet Shield:
ich habe noch zwei weitere Dinge geändert:
- der PIN4 the Mega ist auf OUTPUT geseezt und auf HIGH. Das ist der disable der SD Karte. In einigen Foren, die das gleiche Problem haben wir ich wird dies empfohlen
- das letzte Byte der MAC Adresse entspricht nun einem Wert aus der ASCII Char. Tabelle. War ein Hinweis aus 'nem Forum, da manche Switches bei anderen Werten wohl Probleme haben

Titel: Antw:Arduino Ethernet - Probleme und Erfahrungen
Beitrag von: bugster_de am 30 Juni 2014, 08:12:31
So, der Arduino läuft jetzt seit gestern durch. Sieht also gut aus.
Titel: Antw:Arduino Ethernet - Probleme und Erfahrungen
Beitrag von: Thorsten Pferdekaemper am 01 Juli 2014, 09:58:08
Kannst Du sagen, welche der Maßnahmen letztendlich geholfen hat?
Titel: Antw:Arduino Ethernet - Probleme und Erfahrungen
Beitrag von: bugster_de am 01 Juli 2014, 13:18:35
Hi,

ich habe keine detaillierten versuche gemacht, aber ich bin mir sicher, dass es der SD Karten Pin 4 war.
Speicher: hier habe ich ja an meinem Code nichts geändert sondern nur über deine Funktion die Bestätigung, dass ich wohl kein Speicherloch habe
MAC Adresse: müsste ich mal noch versuchen, aber ich würde mal behaupten, dass dieses Thema doch sofort zuschlagen sollte und nicht erst irgendwann. Entwder die MAC ist ok und Verbindung geht, oder die MAC ist nicht ok, dann geht es nicht.

Titel: Antw:Arduino Ethernet - Probleme und Erfahrungen
Beitrag von: bugster_de am 01 Juli 2014, 13:28:09
Aber andere Frage:
ich habe in meinem Arduino eine Funktion, die die Relais bei Inaktivität durch FHEM wieder ausschaltet (watchdog). Sprich FHEM sendet den Befehl für Relais an, der Arduino setzt einen Zähler auf Null, der bei jeden Durchgang inkrementiert wird. FHEM muß vor Erreichen des Zählers auf den Maximalwert den On Befehl wieder senden (und somit Zähler wieder 0). Sonst geht das relais auf Off. Die Relais steuern z.B. meine Gartenbewässerung und so soll verhindert werden, dass die Gartenbewässerung bei Absturz von FHEM ewig vor sich hin tüdelt. Das geht auch alles ganz gut.

Nun habe ich im Arduino auch die Möglichkeit, dass FHEM diesen Zählerwert neu setzen kann. Das erste Byte des Befehls sind die Minten, das zweite Byte die Sekunden. In meinem FHEM Modul kann ich nun z.B. set ARDU timeout "05:30" setzen und das soll zum Arduino gesendet werden. In FHEM / Perl ist das ein String aus CHAR (die in Perl 32 bit sind?). der Arduino erwartet aber ein unsigned byte. Aber irgendwie verwandelt Perl leider den CHAR nicht in ein BYTE.
ich habe in Perl
$outmin = int( scalar( $inmin ) );
$outsec = int( scalar( $insec ) );

Im Beispiel also $inmin = "05" und $insec = "30";

hast Du da was schlaues?

Ansonsten bleibe ich bei meiner meinung, dass Perl für diese Art der Typkonvertierung, sagen wir mal, verbesserungspotential hat :-)
Titel: Antw:Arduino Ethernet - Probleme und Erfahrungen
Beitrag von: Thorsten Pferdekaemper am 01 Juli 2014, 15:34:36
Hi,
ich baue mir mit solchen Sachen einfach einen String zusammen, den ich an die URL dranhaenge. Also in etwa so:

sprintf("http://192.168.nnn.mmm/atsettmp%.0f", $atf)

$atf ist eine Temperatur, also eine Zahl. Insgesamt kommt dann sowas raus wie
http://192.168.nnn.mmm/atsettmp35
Auf der Arduino-Seite interpretiere ich dann die Zeichenkette "35", indem ich sie explizit in einen int wandle. Das Coding kann ich Dir gerade nicht zeigen, da ich momentan keinen Zugriff darauf habe.
In Deinem Fall wuerde ich sowas basteln wie
http://192.168.nnn.mmm/settimeout0530
Gruss,
    Thorsten
Titel: Antw:Arduino Ethernet - Probleme und Erfahrungen
Beitrag von: bugster_de am 01 Juli 2014, 22:11:25
uebrigens Danke nochmal für die Denkanstösse. Scheint wirklich der PIN gewesen zu sein. Mnachmal steht man halt im Wald.

Das mit den Strings hatte ich auch mal, aber ich fand die String Fummelei auf dem Arduino kostet deutlich zuviel Laufzeit und die Library scheint mir auch nicht wasserdicht zu sein. Ich fahre jetzt asymetrisch: FHEM an ARDUINO ist ein binäres Protokoll, ARDUINO an FHEM sind Strings. Vorteil ist halt auf Arduino Seite, dass man im Empfangspuffer effizient arbeiten kann (Bitschieberei) und man in Sende Richtung vorgefertigte Strings versendet, die man in FHEM/Perl ja schön verarbeiten kann.

Das binäre Protokoll ist ein 11 Byte Protokoll, ws ich mir definiert habe
Männer müssen in ihrme Leben einen Baum Pflanzen
PC SW Entwickler müssen eine eigene Datenbank bauen
Web SW Entwickler müssen ihr eigenes CMS machen und
Embedded SW Entwickler müssen ihre eigenen Protokolle bauen

:-)

Egal, wir haben jetzt Dienstag abend und der Arduino läuft immer noch YIPIEE !!!
Ich kann jetzt den Garten per iPAD giessen und der WAF ist immens. Hat sich also gelohnt :-)

Titel: Antw:Arduino Ethernet - Probleme und Erfahrungen
Beitrag von: andreas.maurer am 09 Juli 2014, 11:59:01
Zitat von: bugster_de am 01 Juli 2014, 22:11:25ARDUINO an FHEM sind Strings.

Ich stehe grade an der gleichen Stelle. Der Arduino Teil ist klar. Was läuft bei dir denn auf der FHEM Seite? Ich möchte Datenwerte über das Internet an FHEM schicken. Konkret geht es um Temperatur und Luftfeuchte aus unserem Ferienhaus.

Andreas
Titel: Antw:Arduino Ethernet - Probleme und Erfahrungen
Beitrag von: Thorsten Pferdekaemper am 09 Juli 2014, 13:06:27
Zitat von: andreas.maurer am 09 Juli 2014, 11:59:01Was läuft bei dir denn auf der FHEM Seite? Ich möchte Datenwerte über das Internet an FHEM schicken. Konkret geht es um Temperatur und Luftfeuchte aus unserem Ferienhaus.
Ich benutze zum Abfragen von Werten einfach das Modul HTTPMOD.
Gruß,
    Thorsten
Titel: Antw:Arduino Ethernet - Probleme und Erfahrungen
Beitrag von: bugster_de am 09 Juli 2014, 13:31:04
bei mir hängt der Arduino im lokalen Netz, so dass ich mit meinem eigenen FHEM Modul mittels der Pel IO::Socket::INET Funktionen darauf zugreifen kann. Wie das per Internet geht habe ich keine Ahnung
Titel: Antw:Arduino Ethernet - Probleme und Erfahrungen
Beitrag von: andreas.maurer am 10 Juli 2014, 10:20:02
Danke für die Antworten. Ist aber für mich nicht nutzbar.

Meine Sensor laden die Daten per HTTP auf einen FHEM Server hoch. Das versuche ich grade mit WBS aber das ist reichlich wackelig und überlebt eine "save config" nicht. Erst nach einen "shutdown restart" will es wieder. Aber das ist ein anderes Thema.
Titel: Antw:Arduino Ethernet - Probleme und Erfahrungen
Beitrag von: bugster_de am 11 Juli 2014, 13:50:12
ZitatIst aber für mich nicht nutzbar
warum nicht? Wenn die andere Lösungen bei dir nicht stabil laufen dann wäre es doch einen Versuch wert oder?


Nebenbemerkung: mein Arduino werkelt jetzt seit fast zwei Wochen fröhlich und ohne Probleme im Keller vor sich her !
Titel: Antw:Arduino Ethernet - Probleme und Erfahrungen
Beitrag von: andreas.maurer am 11 Juli 2014, 19:58:33
:)

Die Sensoren stehen in Renesse/NL und der Fhem Server in Ratingen/D dazwischen sind mindestens 40000km zum Satellit rauf und ebenfalls wieder runter. Zwei Firewalls und diverser anderer Müll.   
Da bekomme ich nur HTTP drüber und keine Socket basierte Kommunikation.

Ok?
Titel: Antw:Arduino Ethernet - Probleme und Erfahrungen
Beitrag von: bugster_de am 11 Juli 2014, 20:28:25
tja dann ...

ich habe einen Controller für die Poolchemie im Keller. Der kann auch nur Http. Da arbeite ich in meinem eigenen FHEM Modul mit GetHttpFile. Geht einwandfrei. Sprich FHEM schickt eine HTTP Anfrage und der Controller schickt im HTTP Format eine CSV Datei zurück. Die werte ich dann aus. Sollte auch gehen.
Titel: Antw:Arduino Ethernet - Probleme und Erfahrungen
Beitrag von: andreas.maurer am 11 Juli 2014, 20:51:59
Ich habe es auch mit WBS laufend. das passt eigentlich genau in mein Konzept.

Der Sensor schickt (soll) alle 15 minuten die aktuellen Daten per 2.4 GHz an die lokale Basis und der Arduino dort lädt das dann per http hoch.

Ich hab das jetzt hier als ProofOffConcept laufen. Das geht. Jetzt wird stabilisiert.

Hier lokal nutze ich nur das firmata zeug zur Anbindungen von einem Arduino an fhem. Das läuft problemlos seid Monaten.

Andreas
Titel: Antw:Arduino Ethernet - Probleme und Erfahrungen
Beitrag von: T.ihmann am 13 Juli 2014, 14:29:21
Ich habe ein Problem mit einem Arduino Nano , ENC28J60 Ethernet Modul und wiederholenden Reconnects. Ich habe drei davon im Einsatz, einer verliert immer die Verbindung....
Titel: Antw:Arduino Ethernet - Probleme und Erfahrungen
Beitrag von: andreas.maurer am 14 Juli 2014, 12:56:40
Und alle drei haben die gleiche, von Hand gesetzte MacAdresse im Sketch :)
Titel: Antw:Arduino Ethernet - Probleme und Erfahrungen
Beitrag von: bugster_de am 21 Juli 2014, 08:34:22
kleiner Update von meiner Seite: das teil läuft jetzt seit Wochen ohne Probleme und Murren vor sich hin. YIPIEEE!

@T.ihmann: ist natürlich ein bisschen schwierig zu raten, was das Problem ist ohne Code zu sehen oder eine Beschreibung der Infrastruktur. Wie schon geschrieben: MAC-Adressen müssen unterschiedlich sein und sie sollten in das weitere oben beschrieben Schema passen. Manche Switches haben Probleme mit bestimmten Adress-Bereichen