FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: Hadl am 26 Februar 2017, 02:20:58

Titel: Kontinuierliche Daten von Serieller Schnittstelle aus Arduino
Beitrag von: Hadl am 26 Februar 2017, 02:20:58
Hallo zusammen,
ich hab schon seit einiger Zeit eine kleine Fhem installation am laufen und will nun das erste mal was richtig DIY machen.
Ziel ist ein meinen alten Ferraris Stromzähler zum Smartmeter zu machen.
Dazu hab ich mir einen Arduino gebaut der mit IR den Roten Streifen auf der Zählerscheibe erkennt und mir dann die Leistung daraus errechnet. Das Ergebnis krieg ich einmal pro Umdrehung der Scheibe.
Jetzt würde ich gerne diese Leistung als Reading in ein Fhem Smartmeter bekommen.
Alle Beispiele die ich gefunden habe gehen aber von einen Get Kommando aus.
Mein Ziel ist es ständig am Seriellen Port mitzuhören und die Kommunikation zu parsen und als Reading darzustellen. Schön wäre es wenn ich alles was da rüber kommt auch ins Log schreiben könnte.
Aktuell sind es zeilenweise Informationspackete, sollte eigentlich mit Perl gut zu parsen sein. Wie krieg ich das aber als device rein?

Den Sketch habe ich auch unter kontrolle, könnte den also auch noch ein bischen tunen.

Gibt es dafür schon eine gute Lösung oder zumindest einen guten Startpunkt?
Titel: Antw:Kontinuierliche Daten von Serieller Schnittstelle aus Arduino
Beitrag von: DeeSPe am 26 Februar 2017, 13:55:50
Was Ähnliches suche ich auch gerade für mein RD-522 Modul.
Evtl. kannst Du mit SIGNALduino was anfangen, ich leider nicht weil keine RFID Library integriert ist.
Habe auch schon mit FHEM Modul ECMD herumprobiert, bislang aber auch nicht erfolgreich.
Möchte auch nur die gelesene ID als Reading in einem Device darstellen.
Habe gestern schon das ganze Forum durchforstet, aber eine wirkliche Lösung habe ich nicht gefunden.

Gruß
Dan
Titel: Antw:Kontinuierliche Daten von Serieller Schnittstelle aus Arduino
Beitrag von: justme1968 am 26 Februar 2017, 14:07:57
schau dir das KeyValuProtokol und das zugehörige modul an. wenn du den arduino code selber schreibst kannst du damit einfach beliebige readings an fhem senden.

gruss
  andre
Titel: Antw:Kontinuierliche Daten von Serieller Schnittstelle aus Arduino
Beitrag von: Icinger am 26 Februar 2017, 14:13:08
Wenn du über die Serielle gehst, kannst du das ganz easy mit ECMD lösen.
Titel: Antw:Kontinuierliche Daten von Serieller Schnittstelle aus Arduino
Beitrag von: DeeSPe am 26 Februar 2017, 15:13:54
Zitat von: justme1968 am 26 Februar 2017, 14:07:57
schau dir das KeyValuProtokoll und das zugehörige modul an. wenn du den arduino code selber schreibst kannst du damit einfach beliebige readings an fhem senden.

gruss
  andre

Danke für den Tipp!
Mein Sketch schreibt nun auf die serielle Schnittstelle:
OK VALUES uid=123456789

Habe mir KeyValueProtocol angesehen, finde in der commandref aber keine Erklärung für "<Type> <ID>"!
define RFID KeyValueProtocol serial /dev/serial/by-id/usb-1a86_USB2.0-Serial-if00-port0@9600
?? ?? ??

Gruß
Dan
Titel: Antw:Kontinuierliche Daten von Serieller Schnittstelle aus Arduino
Beitrag von: justme1968 am 26 Februar 2017, 15:15:30
ist im zugehörigen thread hier im forum beschrieben. such mal danach.

das iodev ist ein JeeLink device. KeyValue wird dann automatisch per autocreate angelegt.
Titel: Antw:Kontinuierliche Daten von Serieller Schnittstelle aus Arduino
Beitrag von: DeeSPe am 26 Februar 2017, 15:25:10
Zitat von: justme1968 am 26 Februar 2017, 15:15:30
ist im zugehörigen thread hier im forum beschrieben. such mal danach.

das iodev ist ein JeeLink device. KeyValue wird dann automatisch per autocreate angelegt.

Finde den Beitrag nicht den Du meinen könntest. ???
Ich schaue heute Abend noch mal in Ruhe...

Gruß
Dan
Titel: Antw:Kontinuierliche Daten von Serieller Schnittstelle aus Arduino
Beitrag von: Hadl am 26 Februar 2017, 17:07:07
Vielen Dank für die Tips,
das KeyValueProtocol hört sich echt interessant für den Fall an, das probier ich auf jedem Fall mal aus.
Da ich den Sketch selbst schreibe kann ich mich den Protokoll leicht anpassen.
https://fhem.de/commandref.html#KeyValueProtocol

ECMD hab ich bei meiner Suche nach einer Lösung schon öfters gesehen und auch schonmal ausprobiert.
Leider war ich damit nicht erfolgreich. Ich hab dabei immer entweder garnichts bekommen oder Fhem mit 100% CPU Last zum einfrieren gebracht.
Hat jemand ein Beispiel wie er sowas schonmal mit ECMD gelöst hat?

Viele Grüße

Christian
Titel: Antw:Kontinuierliche Daten von Serieller Schnittstelle aus Arduino
Beitrag von: justme1968 am 26 Februar 2017, 17:54:18
der eine thread ist hier: https://forum.fhem.de/index.php/topic,44092.msg363044.html#msg363044 (https://forum.fhem.de/index.php/topic,44092.msg363044.html#msg363044), den anderen finde ich auch gerade nicht.

<TYPE> und <ID> sind einfach nur eindeutige strings um mehrere sensoren zu unterscheiden.

alle readings mit gleichem type und gleicher id landen im gleichen fhem device.

du sendest beides vom arduino aus mit. du musst in fhem nichts von hand anlegen. das geht per autocreate.

d.h. du legst nur ein JeeLink device für den angeschlossen arduino an und dieser muss daten in der form OK VALUES <TYPE> <ID> <reading1>=<value1>[,<reading2>=<value2>[,...]]

mehr beispiel nachrichten am anfang von 36_KeyValueProtocol.pm
Titel: Antw:Kontinuierliche Daten von Serieller Schnittstelle aus Arduino
Beitrag von: DeeSPe am 26 Februar 2017, 22:32:30
Zitat von: justme1968 am 26 Februar 2017, 17:54:18
der eine thread ist hier: https://forum.fhem.de/index.php/topic,44092.msg363044.html#msg363044 (https://forum.fhem.de/index.php/topic,44092.msg363044.html#msg363044), den anderen finde ich auch gerade nicht.

<TYPE> und <ID> sind einfach nur eindeutige strings um mehrere sensoren zu unterscheiden.

alle readings mit gleichem type und gleicher id landen im gleichen fhem device.

du sendest beides vom arduino aus mit. du musst in fhem nichts von hand anlegen. das geht per autocreate.

d.h. du legst nur ein JeeLink device für den angeschlossen arduino an und dieser muss daten in der form OK VALUES <TYPE> <ID> <reading1>=<value1>[,<reading2>=<value2>[,...]]

mehr beispiel nachrichten am anfang von 36_KeyValueProtocol.pm

Tip Top!
Funktioniert wie beschrieben!!! 8)

Mein Sketch gibt nun Folgendes aus:
OK VALUES RFID 0001 uid=123456789
Habe dann meinen Arduino einfach als JeeLink angelegt:
define JeeLink JeeLink /dev/serial/by-id/usb-1a86_USB2.0-Serial-if00-port0@9600
Nach dem ersten Lesen eines Tags wurde von autocreate das Device angelegt:
define KeyValueProtocol_RFID_0001 KeyValueProtocol RFID 0001
attr KeyValueProtocol_RFID_0001 IODev JeeLink


Gruß
Dan
Titel: Antw:Kontinuierliche Daten von Serieller Schnittstelle aus Arduino
Beitrag von: Hadl am 01 März 2017, 09:15:14
Hallo zusammen,
ich habs nun hinbekommen das die Daten richtig ins Logfile geschrieben werden.
Readings werden damit aber noch nicht erzeugt. Mein Anwendungsfall zum Ploten sollte damit aber funktionieren.

So siehts bei mir aktuell aus:

fhem.cfg

define myARDUINO JeeLink /dev/ttyUSB0@9600
attr myARDUINO event-on-change-reading .*
attr myARDUINO flashCommand avrdude -p atmega328P -c arduino -P [PORT] -D -U flash:w:[HEXFILE] 2>[LOGFILE]
attr myARDUINO room Arduino

define ARDUINOLog KeyValueProtocol ARDU 1
attr ARDUINOLog IODev myARDUINO
attr ARDUINOLog room Arduino

define ArduLog FileLog ./log/ArduLog-%Y-%m.log ARDUINOLog
attr ArduLog room Arduino

define SVG_ArduLog_1 SVG ArduLog:SVG_ArduLog_1:CURRENT
attr SVG_ArduLog_1 room Arduino

Der flashCommand wurde per Autoconfig eingetragen, den Rest habe ich selbst gemacht.

Der Arduino sendet z.B.:

OK VALUES ARDU 1 Power=1591.04W
OK VALUES ARDU 1 t=1815862,Level=1



Hat jemand eine Idee warum keine Readings eingetragen werden?

Edit: Arduino Code angepasst
Titel: Antw:Kontinuierliche Daten von Serieller Schnittstelle aus Arduino
Beitrag von: justme1968 am 01 März 2017, 09:24:46
es muss ein = und kein : in der arduino ausgabe sein. und der arduino kann auch mehrer reading/werte paare mit komma getrennt in einer einzigen nachricht schicken.

den KeyValueProtokoll device musst du wie gesagt nicht von hand anlegen. das geht per autocreate sobald die erste korrekte nachricht kommt.

was meist du mit keine readings eingetragen?

das etwas im log steht ohne das es readings gibt kann eigentlich nicht sein.
Titel: Antw:Kontinuierliche Daten von Serieller Schnittstelle aus Arduino
Beitrag von: Hadl am 01 März 2017, 10:39:07
Hallo justme,
danke für den Hinweis. Du hast Recht, vom Arduino kommt ein "=" und im Log steht dann ein ":"
Habs oben korrigiert.

Gestern habe ich Fhem aktualisiert, seitdem werden auch die passenden Readings zum Log angelegt.
Vorher waren die Readings leer, jetzt passts.
Damit bin ich dann sehr zufrieden. Ist zwar einiges an overhead auf dem kleinen seriellen Bus, aber es funktioniert.

Als nächstes gehts jetzt daran den Arduino an einen Raspi im Keller zu hängen und dann die Daten zu meinen Fhem Raspi in der Wohnung zu kriegen (LAN/WLAN).
Mögliche Ideen:
- USBIP
- Ser2net
- Fhem2Fhem
- Script das den Arduino output vom virtuellen COM einliest und per z.B. TCP an Fhem weiterleitet.
- weitere Ideen?

Die letzte Variante hätte die Möglichkeit das ich noch weitere Debug Infos aus dem Arduino senden könnte und nur die OK VALUES an FHEM weiterleiten kann.
USBIP hätte den Vorteil das ich evtl mit der Arduino IDE Umgebung remote programmieren und debuggen kann.

Was haltet ihr davon? Hat das schonmal jemand gemacht?
Titel: Antw:Kontinuierliche Daten von Serieller Schnittstelle aus Arduino
Beitrag von: Beta-User am 01 März 2017, 10:47:43
MySensors kennst Du?

www.mysensors.org (http://www.mysensors.org)
https://wiki.fhem.de/wiki/MySensors_Starter_Guide (https://wiki.fhem.de/wiki/MySensors_Starter_Guide)
Titel: Antw:Kontinuierliche Daten von Serieller Schnittstelle aus Arduino
Beitrag von: justme1968 am 01 März 2017, 10:50:50
ich glaube der overhead ist für fast alle praktischen anwendungen vernachlässigbar und wird durch die lesbarkeit mehr als aufgewogen.

wenn du noch ein paar bytes rausquetschend willst kannst du die DICTIONARY nachricht oder das Mapping attribut verwenden und nur ein buchstabige reading namen senden.


ser2net sollte out of the box gehen und funktioniert sehr zuverlässig
usbip wäre etwas komplexer und ist vermutlich mit fhem noch ungetestet
fhem2fhem wäre unnötiger overhead und eine zweite unnötige fhem installation
mit einem script würde ich nicht anfangen. ser2net löst das besser. falls du einen arduino mit ethernet shield hast kannst du das KeyValueProtocoll aber auch direkt (oder per broadcast) senden lassen. das ist schon komplett implementiert.
Titel: Antw:Kontinuierliche Daten von Serieller Schnittstelle aus Arduino
Beitrag von: Hadl am 01 März 2017, 17:39:54
ZitatMySensors kennst Du?
My Sensors kannte ich noch nicht. Wenn ich das richtig verstehe ist der auch erstmal für die Verbindung des Arduinos mit dem Keller Rasi gedacht. Das funktoniert aber über USB bei mir gut.

Noch reicht die Bandbreite, und ich denke ich hab da auch noch Luft nach oben.

ser2net werde ich mal probieren. Mal sehen was dabei rauskommt.

Eine Variante ist mir noch eingefallen:
- MQQT mit Node Red. Hat mir ein Kollege vor kurzem gezeigt. Schaut echt einfach aus dort Signale zu routen.
Titel: Antw:Kontinuierliche Daten von Serieller Schnittstelle aus Arduino
Beitrag von: Beta-User am 01 März 2017, 17:58:15
Zitat von: Hadl am 01 März 2017, 17:39:54
My Sensors kannte ich noch nicht. Wenn ich das richtig verstehe ist der auch erstmal für die Verbindung des Arduinos mit dem Keller Rasi gedacht.

Diesen 2. Satz verstehe ich nicht. Setup wäre (z.B.): Ein Arduino in den Keller (als MySensors-Node), ein Arduino an den PI (der steht irgendwo oben, wenn ich das recht verstanden habe) als MySensors-GW. Zur Verbindung kannst Du entweder Funk nehmen (je ein Modul pro Arduino) oder, sofern Du zwei Adern über hast, auch via RS485. Was an der seriellen Konsole des Gateways rauskommt, wird dann nicht von keyvalueprotokoll verarbeitet, sondern von MySensors-(Device)...

Wenn RS485 könnte auch HM-Wired (die Homebrew-Variante) interessant für Dich sein (es würde sich dann nur das Übertragungsframework ändern).

Oder verstehe ich Dein Anliegen ganz falsch?

Gruß, Beta-User
Titel: Antw:Kontinuierliche Daten von Serieller Schnittstelle aus Arduino
Beitrag von: justme1968 am 01 März 2017, 18:01:53
wobei alle anderen vorgeschlagenen lösungen sich das mehr an möglichkeiten mit mehr aufwand und komplexität erkaufen.

die KeyValueProtokoll version ist in <5 minuten eingebaut und braucht außer einem printf im passenden format keinerlei weitere komponenten, gateways, bestimmte transceiver, libs im sketech,...
Titel: Antw:Kontinuierliche Daten von Serieller Schnittstelle aus Arduino
Beitrag von: Beta-User am 01 März 2017, 18:11:44
Zitat von: justme1968 am 01 März 2017, 18:01:53
wobei alle anderen vorgeschlagenen lösungen sich das mehr an möglichkeiten mit mehr aufwand und komplexität erkaufen.

die KeyValueProtokoll version ist in <5 minuten eingebaut und braucht außer einem printf im passenden format keinerlei weitere komponenten, gateways, bestimmte transceiver, libs im sketech,...
Das stimmt vermutlich, allerdings nur, wenn der PI im Keller eh' da ist und nicht gerade nur dazu dient, die Kommunikation zu ermöglichen...
Titel: Antw:Kontinuierliche Daten von Serieller Schnittstelle aus Arduino
Beitrag von: justme1968 am 01 März 2017, 18:13:32
jein :)

wie gesagt geht es auch per ethernet shield.

Titel: Antw:Kontinuierliche Daten von Serieller Schnittstelle aus Arduino
Beitrag von: Hadl am 03 März 2017, 13:19:51
Also ich hab jetzt folgendes Setup hinbekommen:

Rpi im Keller:
- Arduino der KeyValueProtokoll spricht
- ser2net der das Protokoll ins Netz legt
- LAN Kabel (WLAN zu instabil)

Rpi in Wohnung:
- Fhem der ein JeeLink Device mit dem Keller Raspi verbunden hat.
define myARDUINO JeeLink raspi-keller:2222

Der Raspi im Keller ist vielleicht noch etwas übertrieben und es ginge auch kleiner, aber er versorgt mir aktuell den Arduino mit Strom und LAN.
Plan ist das da noch mehr Schnittstellen (Arduino für Wasser, Optolink für Heizung) rankommen, dann brauch ich nen eigenen Raspi.

Seitdem ich das aktiv habe, funktioniert aber scheinbar mein HMUARTLGW nicht mehr, er bricht immer nach kurzer Zeit die Verbindung ab.
Kann es daran liegen das ich vom Arduino noch alle Sekunde eine Debug Nachricht schicke? Diese geht dann ins Protokoll als
myARDUINO: Unknown code 48765264 377, help me!

Ich hab das auch mal etwas öfters gemacht, dann friert fhem aber mit 100% CPU Last komplett ein und erholt sich nichtmehr.

Zum Thema MySensors:
Zur Verbindung der Nodes bin ich eigentlich mit LAN ganz zufrieden, da ich die am besten und robustesten überall im Haus zur Verfügung habe.
Kleinere Sachen dann WLAN.
Homematic hab ich zwar einiges, aber nur die "echten" eq3 Komponenten mit eimem HMLAN und den HMUARTLGW auf dem Pi