Hauptmenü

Firmata+Arduino

Begonnen von Rohan, 31 Januar 2013, 14:31:12

Vorheriges Thema - Nächstes Thema

ntruchsess

Zitat von: ntruchsess schrieb am Fr, 24 Mai 2013 22:43leider gibt es noch keinen Firmata-sketch für den ENC28J60.[...]Oder steig tiefer in die Materie ein und bringe z.B. den µIP-Stack auf dem Arduino zum Laufen.

So mal ein Update dazu in eigener Sache:

Ich hab eine Wrapper-library um den µIP-Stack von Adam Dunkels geschrieben, mit der man mit dem Arduino jetzt auch richtige persistente Socket-verbindungen mit einem ENC28J60-Shield machen kann. Ist noch nicht 100% stabil, aber das erste Beispiel (ein Server, der alle Eingaben als Echo wieder zurückschickt) geht schon. Zu verwenden fast exakt so, wie die Stock-Ethernet-library :-)

eine Firmata-Version für ENC28J60 rückt damit in greifbare Nähe!

Code findet sich wie immer auf GitHub.

Gruß,

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

kaizo

Hallo Norbert,

mittlerweile habe ich wieder etwas mehr Zeit zum Testen, folgendes ist mir noch aufgefallen:
-FRM benötigt unterschiedlich lange, bis sich der Arduino gemeldet hat. Bis dahin am besten OWX nicht definieren
-Wenn das beim shutdown-restart oder reread nicht richtig geklappt hat und man versucht, den FRM wieder zu löschen und neu zu definieren kommt die Meldung:"FRM: Can't open server port at 3030: Address already in use"
Abhilfe ist hier ein shutdown-restart.

Da mein Arduino mittlerweile im Keller steht ist der Weg immer recht weit, den Arduino über RESET zum reden zu bringen. Wenn RESET gedrück ist meldet sich die Firmata bei FHEM und alles kann weitergehen.

Gibt es einen Workaround hierzu?
Kann nicht FRM eine Variable setzen, so daß OWX erst warten muß, bis FRM/Arduino/Firmata sich gemeldet hat?

Gruß
Kai
FHEM 6.x  auf i3
1x Maplecun FS20, HM, 1x CUL f. WMbus
1x Arduino Nano für Lacrosse, 1x für Empfang WH1080,
1x Arduino Uno+Ethernet-Shield & Firmata für 1Wire
1x Raspberry Pi für Einbindung Junkers-Heizgerät mit HT3-Schnittstelle, div. Sonoff+EspEasy+Tasmota über MQTT

Wzut

@Kai, das Prob hatte ich auch. Meine Lösung : ich habe einen Pin des Arduino ( Pin 5 ) direkt mit 5 V verbunden und frage ihn in fhem auf HIGH ab und erst dann definiere ich OWX
define go_myow notify Firmata_IN_5:reading.* { if (!$value{myonwire}) {fhem("define myonwire OWX 7");;}}
Maintainer der Module: MAX, MPD, UbiquitiMP, UbiquitiOut, SIP, BEOK, readingsWatcher

ntruchsess

Zitat von: kaizo schrieb am So, 28 Juli 2013 18:21Gibt es einen Workaround hierzu?
Kann nicht FRM eine Variable setzen, so daß OWX erst warten muß, bis FRM/Arduino/Firmata sich gemeldet hat?

Hallo Kai,

teste doch mal das asynchron überarbeitete OWX, das sollte kein Problem damit haben schon definiert zu sein, bevor der Arduino sich an FRM verbunden hat.

Bin allerdings erst ab 08.08. wieder in der Lage irgendwas dran zu machen. Vorher ist Urlaub angesagt.

Gruß,

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

kaizo

Hallo Norbert,

also die asynchrone Version geht schon besser, aber wenn zum Start das FRM nicht definiert ist gibt das OWX zwar keine direkte Fehlermeldung, aber die Daten von den DS1820 sind nicht ok. Auch ein "get OWX devices" ergibt kein Ergebnis, FHEM springt einfach zum Hauptmenü ohne Meldung

Versuche jetzt mal zusätzlich den "Workaround" von Wzut, der hört sich auch nicht schlecht an.

Schönen Urlaub noch, Norbert.

Gruß
Kai
FHEM 6.x  auf i3
1x Maplecun FS20, HM, 1x CUL f. WMbus
1x Arduino Nano für Lacrosse, 1x für Empfang WH1080,
1x Arduino Uno+Ethernet-Shield & Firmata für 1Wire
1x Raspberry Pi für Einbindung Junkers-Heizgerät mit HT3-Schnittstelle, div. Sonoff+EspEasy+Tasmota über MQTT

ntruchsess

Zitat von: ntruchsess schrieb am Sa, 20 Juli 2013 00:49
Zitat von: ntruchsess schrieb am Fr, 24 Mai 2013 22:43leider gibt es noch keinen Firmata-sketch für den ENC28J60.[...]
Ich hab eine Wrapper-library um den µIP-Stack von Adam Dunkels geschrieben, mit der man mit dem Arduino jetzt auch richtige persistente Socket-verbindungen mit einem ENC28J60-Shield machen kann.
Code findet sich wie immer auf GitHub.

So, lange nix mehr von mir hören lassen, war den August über in Urlaub (aber derweil nicht untätig...)

Wer mal wieder mit dem Arduino spielen möchte und mit dem ENC28J60 Shield bisher nicht warm wurde: meine arduino_uip-library ist mittlerweile ziemlich stabil, man kann z.B. das Stock Ethernet-Webserver-example damit praktisch ohne Änderungen laufen lassen. Man muss nur den include von "Ethernet.h" auf "UIPEthernet.h" ändern :-). DHCP und DNS laufen auch. Das coole an der Library (und der wesentliche Unterschied zu anderen enc28J60-libs für Arduino ist: Sie unterstützt echtes TCP-ip mit persistenten Verbindungen - 4 parallele connections - und nutzt das interne Memory des enc28j60 als Streambuffer in beide Richtungen... (Die oft referenzierte EtherCard-library kann nur quasi-tcp mit jeweils einem großen Packet in jede Richtung und anschließendem Verbindungsabbruch...)

Gruß,

Norbert

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

ntruchsess

#171
Den ConfigurableEthernetclient habe ich mir jetzt mal wieder zur Brust genommen und das Problem mit dem automatischen Reconnect mal überarbeitet. Vorrausgesetzt der Arduino merkt, dass er nicht mehr verbunden ist wird der bisherige EthernetClient sauber geschlossen und dann im 5-Sekunden Takt versucht wieder zu verbinden. Wenn man den Stecker einfach so zieht, merkt er leider nur dann, wenn er auch was zu senden hat, dass die Verbindung weg ist (Der WIZ5100 schickt nach meiner Beobachtung keine ACK-packete zum Keepalive). Um das zu beschleunigen muss man ggf. dafür zu sorgen, dass immer was über die Leitung geht, dafür kann man z.B. einen Analog-pin konfigurieren (FRM_AD) - ggf. mit einem etwas längerem Reporting-interval.

Mit meiner neuen UIPEthernet-library (https://github.com/ntruchsess/arduino_uip) funktioniert das genauso. Auf einem Uno kann man nur nicht alle Features aktivieren, weil die Library mehr Speicher als die für den WIZ5100 braucht. Digital+Analog-I/O + OneWire passt aber rein. Auf einem Mega ist das natürlich kein Thema mehr.

Hier gibt den aktuellen Sketch:
https://github.com/firmata/arduino/tree/configurable/examples/ConfigurableFirmata

- Norbert

Edit: boa - ich seh grad der Thread wurde schon 19770 mal gelesen. Is ja heftig...
Edit: Link aktualisiert, ist jetzt in die standart ConfigurableFirmata integriert
while (!asleep()) {sheep++};

ntruchsess

Zur Info für alle, die Firmata über Ethernet verwenden: Die EthernetClientFirmata hat es jetzt in den 'standart' configurable-branch geschafft :-)
https://github.com/firmata/arduino/tree/configurable/examples/ConfigurableFirmata
while (!asleep()) {sheep++};

kaizo

Hallo Norbert,

schön zu hören, dass es mit Firmata weitergeht. Die neue Version habe ich seit heute auf dem Arduino, und die scheint nach dem ersten Start auch wieder vernüftig einen Reconnect auszuführen. Ich habe mehrfach FHEM neu gestartet, und bisher war ein Reset des Arduino nicht erforderlich. Das konnte ich bei der vorherigen Ardunio-Soft so nicht feststellen. Wäre schön, wenn es jetzt immer mit dem Reconnect klappt.
Was ein Problem zu sein scheint ist die aktuelle Version von 10_FRM.pm, die mit dem Update ausgerollt wurde. Hiermit bekomme ich immer wieder eine Fehlermeldung, dass die Werte nicht ok sind (habe die Meldung nicht mehr parat, aber was mit Länge der Bytes, steht leider nicht im Log)
Wenn ich die vorherige Version von 10_FRM.pm wieder zurücksichere, können die Werte wieder ausgelesen werden.

Gruß
Kai
FHEM 6.x  auf i3
1x Maplecun FS20, HM, 1x CUL f. WMbus
1x Arduino Nano für Lacrosse, 1x für Empfang WH1080,
1x Arduino Uno+Ethernet-Shield & Firmata für 1Wire
1x Raspberry Pi für Einbindung Junkers-Heizgerät mit HT3-Schnittstelle, div. Sonoff+EspEasy+Tasmota über MQTT

ntruchsess

Kai, danke für das Feedback.

Vieleicht kannst Du die Fehlermeldung irgendwie abfangen (fhem per screen starten oder so, wenn es nur auf die Konsole geschrieben wird)...

Gruß,

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

kaizo

Hallo Norbert,

die Fehlermeldung lautet z.B.
OWCOUNT: Could not get values from device Zaehler, reason: invalid data length, 3 instead of 45 bytes in three stepsinvalid data length, 3 instead of 45 bytes in three steps

Zaehler ist natürlich der Name des Devices

Gruß
Kai
FHEM 6.x  auf i3
1x Maplecun FS20, HM, 1x CUL f. WMbus
1x Arduino Nano für Lacrosse, 1x für Empfang WH1080,
1x Arduino Uno+Ethernet-Shield & Firmata für 1Wire
1x Raspberry Pi für Einbindung Junkers-Heizgerät mit HT3-Schnittstelle, div. Sonoff+EspEasy+Tasmota über MQTT

ntruchsess

#176
hallo Kai,

kann es sein, dass Du die asynchronen OWX-Module benutzt und dir das Update nur FRM überschrieben hat?

Edit: ich denke, dass mein letzter Commit (vorgestern Nacht) das Problem behebt, da war tatsächlich ein Bug in Verbindung mit owx und frm über Netzwerk... kannst du damit nochmal testen?

Gruß,
Norbert
while (!asleep()) {sheep++};

kaizo

Hallo Norbert,

heute morgen das Update durchgeführt, und bisher keine Probleme mit den Versionen gehabt. Keine Fehlermeldungen von FRM oder seinen Modulen.
Das ist bisher das beste aller Updates in Richtung FRM. Bin gespannt, ob beim nächsten Neustart auch die Verbindung wieder automatisch hergestellt wird.
Danke dafür.

Einen Fehler gibt bei mir OWCOUNT aus:
Argument "" isn't numeric in multiplication (*) at ./FHEM/21_OWCOUNT.pm line 1226.
Argument "" isn't numeric in multiplication (*) at ./FHEM/21_OWCOUNT.pm line 1235.

Ich habe mir die Zeilen im Modul mal angesehen und festgestellt, du hast da auch was angepasst, gerade bei diesen Zeilen
Vielleicht kannst da auch noch etwas bereinigen?

Gruß
Kai

PS: Bin heute nicht mehr zu erreichen, wenn ich da noch mal Daten liefern soll, geht das erst ab Sonntag wieder.
FHEM 6.x  auf i3
1x Maplecun FS20, HM, 1x CUL f. WMbus
1x Arduino Nano für Lacrosse, 1x für Empfang WH1080,
1x Arduino Uno+Ethernet-Shield & Firmata für 1Wire
1x Raspberry Pi für Einbindung Junkers-Heizgerät mit HT3-Schnittstelle, div. Sonoff+EspEasy+Tasmota über MQTT

ntruchsess

Zitat von: kaizo am 01 November 2013, 09:18:25
Das ist bisher das beste aller Updates in Richtung FRM. Bin gespannt, ob beim nächsten Neustart auch die Verbindung wieder automatisch hergestellt wird.
Danke dafür.
Prima :-)
In den nächsten Tagen gibt es noch ein kleineres Update der OWX-Module die beim Reconnect bzw. Restart noch ein paar Details feinschleifen. Kommt aber erst in den Trunk, wenn ich alles auf Herz und Nieren getestet habe. (Wer will kann sich die schon mal aus dem branch 'refactoring_owtherm runterladen und mittesten, über Feedback würde ich mich freuen).
Geändert habe ich:
- Setzen der Statuswerte beim Neustart gefixed (alle Devices, bisher gabs immer Mecker 'define Device ... first').
- Device-discovery (incl. Autocreate) auch bei verzögertem Connect (FRM, alle OW-Devices).
- Device-spezifisches Interval jetzt auch per Attribut 'interval' (alle Devices). Das Attribut überlebt im Gegensatz zum 'set xxx interval 123' auch einen Restart ;-)
- Neues Attribute 'resolution' für den DS18x20 (9-12 Bit, 12 Bit default. Bei niedrigerer Auflösung geht die Messung schneller, geht mit OWX und OWServer).
- Initialisierung des OWTHERM-devices erst nach Auslesen der Configuration aus dem DS18x20 (sonst überschreiben die Default-werte die im Baustein ggf. schon gespeicherte Config - auch OWX und OWServer).

Zitat von: kaizo am 01 November 2013, 09:18:25
Einen Fehler gibt bei mir OWCOUNT aus:
Argument "" isn't numeric in multiplication (*) at ./FHEM/21_OWCOUNT.pm line 1226.
Argument "" isn't numeric in multiplication (*) at ./FHEM/21_OWCOUNT.pm line 1235.
ja, kenn ich, hat mit der (mit dem DS2343-ATiny-Nachbau eh nicht funktionierenden) Speicherung der Tageswerte im Zähler zu tun. Habe ich schon auf der Todo-liste.

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

ntruchsess

#179
Zitat von: kaizo am 01 November 2013, 09:18:25
Einen Fehler gibt bei mir OWCOUNT aus:
Argument "" isn't numeric in multiplication (*) at ./FHEM/21_OWCOUNT.pm line 1226.
Argument "" isn't numeric in multiplication (*) at ./FHEM/21_OWCOUNT.pm line 1235.
Ersetzte doch bitte im 21_OWCOUNT.pm die beiden Zeilen 1226 und 1235 (beide: $owg_str = 0.0 if(!(defined($owg_str)));) jeweils durch:
$owg_str = 0.0 if(!defined($owg_str) or $owg_str !~ /^\d+\.?\d*$/);
Ich kann das selber (mangels Hardware die passenden 'Müll' aus dem Tageswertspeicher schickt) nicht testen

- Norbert

Edit:
- pattern angepasst (ein Satz Klammern war zuviel).
- hab den Fix selber grade getestet und in den branch refactoring_owtherm gemerged.
while (!asleep()) {sheep++};