Kontinuierliche Daten von Serieller Schnittstelle aus Arduino

Begonnen von Hadl, 26 Februar 2017, 02:20:58

Vorheriges Thema - Nächstes Thema

Hadl

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?

DeeSPe

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
MAINTAINER: 22_HOMEMODE, 98_Hyperion, 98_FileLogConvert, 98_serviced

Als kleine Unterstützung für meine Programmierungen könnt ihr mir gerne einen Kaffee spendieren: https://buymeacoff.ee/DeeSPe

justme1968

#2
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
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

Icinger

Wenn du über die Serielle gehst, kannst du das ganz easy mit ECMD lösen.
Verwende deine Zeit nicht mit Erklärungen. Die Menschen hören (lesen) nur, was sie hören (lesen) wollen. (c) Paulo Coelho

DeeSPe

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
MAINTAINER: 22_HOMEMODE, 98_Hyperion, 98_FileLogConvert, 98_serviced

Als kleine Unterstützung für meine Programmierungen könnt ihr mir gerne einen Kaffee spendieren: https://buymeacoff.ee/DeeSPe

justme1968

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.
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

DeeSPe

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
MAINTAINER: 22_HOMEMODE, 98_Hyperion, 98_FileLogConvert, 98_serviced

Als kleine Unterstützung für meine Programmierungen könnt ihr mir gerne einen Kaffee spendieren: https://buymeacoff.ee/DeeSPe

Hadl

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

justme1968

der eine thread ist hier: 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
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

DeeSPe

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, 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
MAINTAINER: 22_HOMEMODE, 98_Hyperion, 98_FileLogConvert, 98_serviced

Als kleine Unterstützung für meine Programmierungen könnt ihr mir gerne einen Kaffee spendieren: https://buymeacoff.ee/DeeSPe

Hadl

#10
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

justme1968

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.
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

Hadl

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?

Beta-User

Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors

justme1968

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.
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968