Hauptmenü

Firmata+Arduino

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

Vorheriges Thema - Nächstes Thema

ntruchsess

wenn ich das richtig sehe, dann ist der DHT11 gar kein 'echter' OneWire-sensor (im Sinne von Dallas), der wird über FRM im Augenblick gar nicht direkt auslesbar sein :-(

Da müstest Du Dir einen eigenen Firmata-basierten sketch implementieren (der die existierende DHT11-library nutzt) und dazu ein passendes FRM-Client modul schreiben. Direkt über FRM mit dem Arduino-pin kommunizieren und das DHT11-eigene Protokoll 'remote' abzuwickeln wird vom Timing her wohl nicht zuverlässig gehen.

Echte (im Sinne von Dallas) OneWire-devices sind kein Problem. DS18B20 Sensoren z.B. kannst Du über den Weg FRM->OWX->OWTHERM unmittelbar auswerten und mitloggen.

Für Luftfeuchte gibt's auch I2C-Sensoren (z.B. diesen hier: http://shop.emsystech.de/de/SHT21-Breakout-Board). So was wäre über FRM auch ziemlich leicht nutzbar. Das FRM_I2C-modul ist zwar noch recht rudimentär, es ließt bisher nur die Rohdaten angeschlossener I2C-devices - code, der das lesbar aufbereitet wäre allerdings vergleichsweise einfach zu integrieren. Ich hab da selber bisher halt noch keinen eigenen Anwendungsfall gehabt.

Gruß,

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

kaizo

Ja, stimmt, der DHT11 ist kein 1-wire. Ist nur schade, weil auch der kann sehr einfach vom Arduino abgefragt werden.

Übrigens, wenn ich define frm FRM 192.168.3.89:3030 eingebe kommt ein Fehler. Woran kanns liegen? Die libs sind in /FHEM/libs komplett kopiert.

Das log sagt:
2013.02.18 19:54:36 1: reload: Error:Modul 10_FRM deactivated:
 Type of arg 1 to keys must be hash (not hash element) at ./FHEM/10_FRM.pm line 231, near "})"
Type of arg 1 to keys must be hash (not hash element) at ./FHEM/10_FRM.pm line 236, near "})"
Type of arg 1 to keys must be hash (not hash element) at ./FHEM/10_FRM.pm line 241, near "})"
syntax error at ./FHEM/10_FRM.pm line 343, near "package Firmata_IO {
   
   "

2013.02.18 19:54:36 0: Type of arg 1 to keys must be hash (not hash element) at ./FHEM/10_FRM.pm line 231, near "})"
Type of arg 1 to keys must be hash (not hash element) at ./FHEM/10_FRM.pm line 236, near "})"
Type of arg 1 to keys must be hash (not hash element) at ./FHEM/10_FRM.pm line 241, near "})"
syntax error at ./FHEM/10_FRM.pm line 343, near "package Firmata_IO {


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

na mal schauen, vieleicht hole ich mir ja mal einen DHT11 und schreibe einen FirmataSketch dafür, der dann auch mit FRM redet. Die Beispiele das Teil auf dem Arduino auszulesen sind ja ziemlich simpel, das sollte kein Problem sein.

Zurück zur EthernetFirmata:

Schaut ja im Prinzip schon mal gut aus, damit der Fehler in FRM Zeil 231 überhaupt auftreten kann, muss der Arduino wohl geantwortet haben. Nur ist in der Struktur in der die geparste Antwort landet nicht das drin, was der code erwartet.
Kannst Du mal mit 'attr global verbose 5' den Loglevel beim Start hochdrehen, dann schreibt FRM jedes Byte, das über die Leitung geht ins log.
Der 'syntax-fehler near 343' macht aber irgendwie gar keinen Sinn, der wäre überhaupt nicht von den Antworten des Arduinos abhängig. Auf welcher Perl-version läuft das?

Gruß,

Norbert

P.S. hab mir grade ein EthernetShield bestellt, d.h. in ein paar Tagen wird die Sache laufen ;-)
while (!asleep()) {sheep++};

kaizo

Ja, ich denke auch, den DHT11 zu integrieren sollte nicht ganz so schwierig sein, ebenso wie einige weitere Sensoren. Nachteil des DHT 11 ist die etwas schlechtere Auflösung der Sensoren.


Bei mir auf der NAS läuft Perl 5.10, leider gibt es von Qnap/ipkg-Verwaltung keine neuere Version.

Das Log sagt bei Verbose 5 nicht viel anderes:
2013.02.19 20:49:41 4: HTTP FHEMWEB:192.168.3.117:54948 GET /fhem?room=Unsorted&cmd=define+frm+FRM+192.168.3.89%3A3030
2013.02.19 20:49:41 5: Cmd: >define frm FRM 192.168.3.89:3030<
2013.02.19 20:49:41 5: Loading ./FHEM/10_FRM.pm
2013.02.19 20:49:42 1: reload: Error:Modul 10_FRM deactivated:
 Type of arg 1 to keys must be hash (not hash element) at ./FHEM/10_FRM.pm line 231, near "})"
Type of arg 1 to keys must be hash (not hash element) at ./FHEM/10_FRM.pm line 236, near "})"
Type of arg 1 to keys must be hash (not hash element) at ./FHEM/10_FRM.pm line 241, near "})"
syntax error at ./FHEM/10_FRM.pm line 343, near "package Firmata_IO {

"

2013.02.19 20:49:42 0: Type of arg 1 to keys must be hash (not hash element) at ./FHEM/10_FRM.pm line 231, near "})"
Type of arg 1 to keys must be hash (not hash element) at ./FHEM/10_FRM.pm line 236, near "})"
Type of arg 1 to keys must be hash (not hash element) at ./FHEM/10_FRM.pm line 241, near "})"
syntax error at ./FHEM/10_FRM.pm line 343, near "package Firmata_IO {

"

2013.02.19 20:49:42 4: /fhem?room=Unsorted&cmd=define+frm+FRM+192.168.3.89%3A3030 / RL: 861 / text/html; charset=UTF-8 / Content-Encoding: gzip
 /



Das gleiche kommt auch bei "define frm FRM none"
/
2013.02.19 20:55:12 4: HTTP FHEMWEB:192.168.3.117:55016 GET /fhem?room=Unsorted&cmd=define+frm+FRM+none
2013.02.19 20:55:12 5: Cmd: >define frm FRM none<
2013.02.19 20:55:12 5: Loading ./FHEM/10_FRM.pm
2013.02.19 20:55:12 1: reload: Error:Modul 10_FRM deactivated:
 Type of arg 1 to keys must be hash (not hash element) at ./FHEM/10_FRM.pm line 231, near "})"
Type of arg 1 to keys must be hash (not hash element) at ./FHEM/10_FRM.pm line 236, near "})"
Type of arg 1 to keys must be hash (not hash element) at ./FHEM/10_FRM.pm line 241, near "})"
syntax error at ./FHEM/10_FRM.pm line 343, near "package Firmata_IO {

"

2013.02.19 20:55:12 0: Type of arg 1 to keys must be hash (not hash element) at ./FHEM/10_FRM.pm line 231, near "})"
Type of arg 1 to keys must be hash (not hash element) at ./FHEM/10_FRM.pm line 236, near "})"
Type of arg 1 to keys must be hash (not hash element) at ./FHEM/10_FRM.pm line 241, near "})"
syntax error at ./FHEM/10_FRM.pm line 343, near "package Firmata_IO {

"

2013.02.19 20:55:12 4: /fhem?room=Unsorted&cmd=define+frm+FRM+none / RL: 861 / text/html; charset=UTF-8 / Content-Encoding: gzip
 /


Was nun?

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

ok, das liegt wohl wirklich am Perl 5.10 - da werden Ausdrücke wie
keys $device->{metadata}{analog_resolutions}  nicht automatisch dereferenziert. Ich muss mich mal schlau machen, welche Syntax da schon funktioniert. Perl 5.10 ist halt schon ein bischen in die Jahre gekommen.

Gruß,

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

ntruchsess

Hallo Kai,

ich habe die Zeilen, die bei Dir Fehler machen mal für Perl 5.10 syntaktisch 'entschärft'. Hoffe das es jetzt auch bei Dir läuft. Das nicht mehr log-ausgaben gekommen sind ist klar - der code, der eigentlich mit dem Arduino kommunizieren soll hat bei Dir ja gar nicht compiliert...

Gruß,

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

kaizo

Hallo Norbert,

habe das ganze dann heute endlich mal testen können. Der Fehler kommt nicht mehr, FHEM läuft durch und es wird auch alles richtig angezeigt.
Allerdings lässt sich ein 1-Wire-Sensor nicht auslesen.

Habe nach
define frm frm 192.168.3.89:3030
define OWio OWX 2

nichts weiteres erkennen können.

Dann mit
get OWio devices
kommt die Meldung: OWX: 1-Wire devices found on bus OWio
Es werden aber keine Devices angezeigt.

Das ist doch sicherlich nicht alles?
 OWX zeigt folgendes an:
ALARMDEVS
ALARMED no
CFGFN
DEF 2
INTERFACE firmata
IODev frm
NAME OWio
NR 151
PIN 2
PRESENT 1
ROM_ID FF
STATE Active
TYPE OWX
followAlarms off
interval 300


Interessant ist hier das ROM_ID mit FF
Fhem müsste bei mir in dieser Konfig mind. 2 DS1820 erkennen.

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

kaizo

Hallo Norbert,

muß mich noch bedanken für Deine Anpassung!

Zur Fehlereingrenzung hier noch ein Log-Auszug:
2013.02.24 09:47:49 4: HTTP FHEMWEB:192.168.3.117:56683 GET /fhem?cmd=get+OWio+devices
2013.02.24 09:47:49 5: Cmd: >get OWio devices<
2013.02.24 09:47:49 5: >f0,73,40,02,f7
2013.02.24 09:47:49 5: SW: �s@�
2013.02.24 09:47:52 1: OWX: 1-Wire devices found on bus OWio ()
2013.02.24 09:47:52 4: /fhem?cmd=get+OWio+devices / RL: 855 / text/html; charset=UTF-8 / Content-Encoding: gzip
 
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

Hallo Kai,

danke für das Feedback. Ich habe gestern mein Ethernetshield bekommen, verhält sich bei mir genauso - Verbindet, schickt alle Metadaten und reagiert dann nicht mehr. Ich hatte aber gestern nicht viel Zeit das genauer zu untersuchen. Was mir spontan aufgefallen ist, war dass die SPI-pins (10-13) für die Ethernetschnittstelle weiterhin als für I/O verfügbar aufgeführt wurden (Wenn man die Details des FRM-devices anschaut). Das sollte eigentlich nicht so sein - so kann sich die Firmata quasi hintenrum selbst die Ethernetschnittstelle abschießen. Naja - jetzt wo ich die passende Hardware dahabe, kann ich das endlich auch mal genauer unter die Lupe nehmen.

Einen DHT11 habe ich mir übrigens auch bestellt um die Library mal in Firmata einzubinden.

Gruß,

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

kaizo

Hallo Norbert,

Du hast recht, Firmata könnte über die Pins 10-13 die Ethernetschnittstelle beeinflussen, ebenso den Zugriff auf die SD-Karte.
Den DHT-11 einbinden sollte vom Grundsatz her nicht so schwierig sein, ebenso die Einbindung weiterer Sensoren (wenn man Firmata und das Protokoll erst einmal verstanden hat)

Schön dass du jetzt auch die Hardware besitzt, der Arduino bietet doch einiges an Funktionen und Möglichkeiten.

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

Hallo Kai,

bin mit dem Shield jetzt ein bischen weiter gekommen. Man muss Pin 4 (SS für den SD-Kartenleser) vom Firmata-handling ausschließen und als Output mit Pegel high konfigurieren.
Soweit, sogut - jetzt verbindet sich FRM mit dem Arduino, bekommt die Metadaten rübergeschickt, der Scan nach OWX-Devices klappt auch, und mal einen Outputpin anschalten. Aber irgendwann antwortet das Teil ohne einen bestimmten Grund einfach nicht mehr. Wenn ich mit netstat -a nachschaue bleibt die Verbindung aber immer noch auf 'CONNECTED' stehen, auch wenn sich der Arduino tot stellt). Im loop frage ich das aktuelle EthernetClient-object per 'connected()' ab, ob die Verbindung noch steht, falls nicht, wird auf die nächste Verbindungsaufnahme gewartet. Die kommt natürlich nicht (der PC meint ja noch verbunden zu sein :-(
Bin grade ein bischen ratlos (ist ja auch schon Mitternacht durch und ich hatte letzte Nacht nur 4 Std. Schlaf).

Muss mal nach (etwas umfangreicheren) Beispielen suchen wie man das mit dem Arduino EthernetServer am besten macht, wenn man die Verbindung offen halten will. Aber vieleicht ist es doch sinnvoller bzw. stabiler den Arduino als Client und FRM mit einem Serverport laufen zu lassen.

Gruß,

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

ntruchsess

so, dann mal ein kurzes Update:
hab das mit der EthernetServer Firmata heute mal grundsätzlich ans Laufen gebracht, Digital und Analog-I/O und OneWire haben soweit schon mal funktioniert, allerdings war die Verbindung nicht 100% stabil - die Arduino-Ethernetlibrary hat regelmäßig (arduinoseitig) dis- und reconnected, wärend das FRM-modul davon offenbar nicht viel mitbekommen hat - jedenfalls blieb die IP-verbindung dabei offen.
Das Problem, die Firmata von den SPI-pins wegzuhalten ist jedenfalls gelöst, das ist schon mal ein guter Anfang. Den Firmata-code gibts, wenn er stabil läuft, bin jedenfalls auf dem richtigen Weg dahin.
Ach ja, die Firmata habe ich dazu erst mal ziemlich komplett refactored, es ist jetzt viel einfacher neue Features einzubauen: https://github.com/ntruchsess/arduino/blob/configurable_onewire_scheduler/examples/ConfigurableFirmata/ConfigurableFirmata.ino Man muss eigentlich nur einen recht dünnen Wrapper um die entsprechende Sensor-library stricken und ein paar vorgegebene Methoden zur Anbindung an die Firmata implementieren. (Hier z.B. der Handler für Analogen Input: https://github.com/ntruchsess/arduino/blob/configurable_onewire_scheduler/utility/AnalogInputFirmata.cpp). Einen DHT11 einzubinden ist damit nur noch eine Sache von wenigen neuen Zeilen code. Leider ist der DHT11 noch nicht da. Sollte zwar angeblich aus dem deutschen Versandlager kommen aber vieleicht liegt das ja doch in Hongkong...

Gruß,

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

ntruchsess

so jetzt gibt's endlich mal eine Erfolgsmeldung zum Thema:

FRM kann jetzt im servermode auf Serversocket lauschen und darauf warten, dass sich ein Arduino mit Ethernetfirmata verbindet. Dazu wird in der define-zeile einfach der port (gefolgt von einem 'global') angegeben. Global bedeutet, dass auf allen ip-addressen des FHEM-servers gelauscht wird. (Ohne global lauscht es nur an localhost, das ist in diesem Fall natürlich nicht sinnvoll, da der Arduino ja remote verbindet).

define FIRMATA FRM 3030 global

Der Arduino muss eine EthernetClientFirmata geladen haben. Die gibt's hier auf Github. Mit dem darin enthaltenen Verzeichnis 'Firmata' bitte die mit der Arduino-IDE mitgelieferte Firmata-library ersetzen. (Siehe auch das beiliegende Readme-file). Anschließend findet man den Sketch unter 'Datei'->'Beispiele'->'Firmata'->'ConfigurableEthernetclient'. Im Sketch muss man die ip-addresse anpassen (hier muss die des FHEM-servers eingetragen werden). Als Port trägt man das ein, was man auch für FRM konfiguriert (bei mir Port 3030). Der Sketch ist 'konfigurierbar' - d.h. man kann die Firmata-features, die man nicht braucht einfach rauskonfigurieren, indem man die entsprechenden defines am Anfang des Sketches entfernt. (Der Rest ist im Sketch mit ifdefs geregelt).

Es spielt keine Rolle, ob zuerst FHEM oder der Arduino gestartet wird. Letzterer versucht solange zur konfigurierten IP-addresse/port zu verbinden, bis es klappt. Leider funktioniert ein Neuaufbau der Verbindung bisher nur, wenn man den Arduino resettet - die Ethernet-Library kriegt einen Verbindungsabbruch durch FHEM offenbar nicht mit. (Dazu gibts auch einen Bug-report und wohl auch einen Fix, ddas muss ich mir aber erst mal näher ansehen). Dafür kommt FRM gut damit klar, dass der Arduino mal weg ist und später wiederkommt.

Es funktioniert bisher Digital- und Analoges I/O, am OneWire-support bin ich dran.

- Gruß,

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

est

Hallo wiedermal,

ich bin begeistert was Du so auf die Beine stellst. Die aktuelle Version mußte ich jetzt auch gleich mal testen (erstmal nur digital Out mit drei LEDs).

Bei mir funktioniert das schon recht gut. Nach einem Reset des Arduino findet sich das ganze innerhalb weniger Sekunden wieder. Nach einem Verbindungsabbruch auf Seiten FHEM dauert es etwa 2-3 Minuten, danach konnte ich wieder schalten.
In beide Richtungen kommt die Syncronisation aus dem Tritt. Nach einem Reset bleibt auf der jeweiligen Kompnente alles aus, auf der Gegenseite bleibt der letzten Status bestehen. FHEM merkt also nicht wenn sich der Arduino resettet hat und der Arduino interessiert sich auch nicht dafür welche Ports vorher an oder aus waren.

Du bist also auf jeden Fall einen Großen Schritt weiter.

So jetzt versuche ich mal zu verstehen wie Du das auf der Arduino-Seite machst. An dem was Du da ablieferst merke ich das ich offenbar noch "garkene Aanung hab wie mer sowas machn dud"
FHEM unter Ubuntu Server aus ESXi 5
1 HM-LAN, 3 HM-CC-RT-DN, 3 HM-CC-TC, 4 HM-CC-VD
1 Arduino verbindet die Vitodens + oneWire + sonstigen Heizungskram über Ethernet mit dem telnet-Port von FHEM

ntruchsess

Hallo Kai, hallo Eddy,

ich grade mal eine FirmataFeature-klasse für den DHT11-sensor geschrieben:
https://github.com/ntruchsess/arduino/tree/configurable_customfeature/examples/DHT11Firmata

ist erfrischend einfach, jetzt, da die Grundlagen erst mal gelegt sind ;-)

ein Beispiels perl-client ist auch schon da:
https://github.com/ntruchsess/perl-firmata/blob/master/examples/example_DHT11.pl

d.h. das passende FHEM-modul ist damit nicht mehr weit...

Gruß,

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