FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: Rantanplan am 19 Juli 2022, 10:09:46

Titel: ECMD classdef für Arduino BMP280_Sensortest
Beitrag von: Rantanplan am 19 Juli 2022, 10:09:46
moin.
ich hab gedacht, ich upcycle meinen alten Naze32 Flightcontroller zu einer USB Temperatursonde. Bestehend aus einem CH430, STM32F1 und BMP280. (plus MPU & MAG auf die ich hier nicht eingehen will)
Arduino Bibliothek für den STM32F1 geladen, Adafruits BMP280 Library dazu, BMP280_Sensortest.ino angepasst ( "status = bmp.begin(0x76,0x58);") und man bekommt im Serial monitor brav ca alle 2 Sekunden eine Zeile für Temperatur (Serial.println(" *C") und eine für den Druck (  Serial.println(" hPa"):
Temperature = 28.74 *C
Pressure = 1017.76 hPa

wunderbar! ab an den RPI auf dem fhem läuft...und dann...lesen; ah, ecmd device, ok...
Aber ich scheitere mal wieder an den regex...bzw irgendwo dazwischen.
Muss ich nach einem ECMDDevice define auch dessen Readings definieren?
warum funktioniert "reading Temperature match " Temperature = *([0-9\.]+) *C\n""  in der .classdef nicht?
lost-plz:help
Titel: Antw:ECMD classdef für Arduino BMP280_Sensortest
Beitrag von: Beta-User am 19 Juli 2022, 10:31:36
Kenne ECMD zwar nicht, aber erfahrungsgemäß sind Leerzeichen und "Solosterne" (je) ein Problem innerhalb regex-Ausdrücken.

Vielleicht klappt es so:
reading Temperature match "Temperature.=.*([0-9\.]+).*C\n"
Titel: Antw:ECMD classdef für Arduino BMP280_Sensortest
Beitrag von: Rantanplan am 19 Juli 2022, 10:41:37
hi, danke für den Tip, leider bekomme ich immer noch keine vernünftigen, nachvollziehbare readings/logs:
in Arduino: Serial.print(F("Temperature = "));
Serial.print(temp_event.temperature);
Serial.println(" *C");

Serial.print(F("Pressure = "));
Serial.print(pressure_event.pressure);
Serial.println(" hPa");

meine def: serial /dev/ttyUSB1@9600
2022.07.19 10:36:37 1 : Afro_Serial: read T (\124)
2022.07.19 10:36:37 1 : Afro_Serial: read emperatur (\145\155\160\145\162\141\164\165\162)
2022.07.19 10:36:37 1 : Afro_Serial: read e = 30.10 (\145\040\075\040\063\060\056\061\060)
2022.07.19 10:36:37 1 : Afro_Serial: read  *C\r\nPres (\040\052\103\015\012\120\162\145\163)
2022.07.19 10:36:37 1 : Afro_Serial: read sure = 101 (\163\165\162\145\040\075\040\061\060\061)
2022.07.19 10:36:37 1 : Afro_Serial: read 7.53 hPa (\067\056\065\063\040\150\120\141)
2022.07.19 10:36:37 1 : Afro_Serial: read \r\n (\015\012)


meine classdef:
params Temperature Pressure
reading Temperature match "Temperature.=.*([0-9\.]+).*C\n"
#reading Temperature postproc {/(\d+\.\d+)/; $1 }
reading Pressure match " (Pressure =) *([0-9\.]+) hPa\r\n"
reading Pressure postproc {/(\d+\.\d+)/; $1 }

Titel: Antw:ECMD classdef für Arduino BMP280_Sensortest
Beitrag von: Beta-User am 19 Juli 2022, 10:57:47
Klingt für mich danach, als solltest du dir die "split"- und (vielleicht?) "partial"-Attribute ansehen.
Titel: Antw:ECMD classdef für Arduino BMP280_Sensortest
Beitrag von: Rantanplan am 19 Juli 2022, 11:01:15
bin dabei:
attr partial 3 & .classdef
params Temperature Pressure
reading Temperature match "Temperature.=.*([0-9\.]+).*C\n"
reading Pressure match "Pressure.=. *([0-9\.]+).*hPa\n"

ergibt:
2022.07.19 10:57:36 1 : Afro_Serial: read T (\124)
2022.07.19 10:57:36 1 : Afro_Serial: read emperature = 30.68 *C\r\nPressure = 1017.44 hPa\r\n (\145\155\160\145\162\141\164\165\162\145\040\075\040\063\060\056\066\070\040\052\103\015\012\120\162\145\163\163\165\162\145\040\075\040\061\060\061\067\056\064\064\040\150\120\141\015\012)


es hängt an diesem "T (\124)"?
Titel: Antw:ECMD classdef für Arduino BMP280_Sensortest
Beitrag von: Beta-User am 19 Juli 2022, 11:10:17
Ich hatte mit einer gewissen Absicht erst split genannt...

Ansonsten sehe ich noch Leerzeichen in Pressure match! (Btw: Schreib' die Readings klein, ist standardkonformer...).

Nachtrag: Wie oft sendest du? (Generell: Deine Infos sind insgesamt etwas kurz geraten).
Titel: Antw:ECMD classdef für Arduino BMP280_Sensortest
Beitrag von: Rantanplan am 19 Juli 2022, 11:38:13
ca alle 2 Sekunden, hab den Log im Blick, keine Sorge  ::)
dachte ich fasse mich lieber kurz, sodass man die Entwicklung nachvollziehen kann.
split \r\n scheint nicht zu funktionieren.?
Titel: Antw:ECMD classdef für Arduino BMP280_Sensortest
Beitrag von: Beta-User am 19 Juli 2022, 11:41:18
Wie gesagt, ich kenne ECMD nicht...

Letzter Versuch von meiner Seite: Setze mal das Sendeintervall hoch (10 Sek. +), so dass partial auch (deutlich) kleiner ist wie dein Intervall...
Titel: Antw:ECMD classdef für Arduino BMP280_Sensortest
Beitrag von: Rantanplan am 19 Juli 2022, 13:00:05
ich will den original Code benutzen, das ist nicht möglich.
hat denn ein "partial 0.5" eine Wirkung?
Titel: Antw:ECMD classdef für Arduino BMP280_Sensortest
Beitrag von: Beta-User am 19 Juli 2022, 13:02:52
Vermutlich. Hast du es ohne partial (aber mit split) schon versucht? (Ich sehe noch keinen Grund, warum das nicht gehen sollte, ist doch eigentlich (zumindest in meiner theoretischen Welt) der "klassische Fall").
Titel: Antw:ECMD classdef für Arduino BMP280_Sensortest
Beitrag von: Rantanplan am 19 Juli 2022, 13:19:58
zunächst:
ich probiere mich noch in der classdef aus:
params Temperature Pressure
#reading temperature match ".Temperature.=.*([-+.,0-9]+).*"
#reading temperature match "%Temperature.=.*([0-9\.]+).*"
#reading temperature match ".*ture.=.([-+.,0-9]+).
reading temperature match "Temperature[^\n]+\n"
reading temperature postproc { /Temperature.=.([-+.,0-9]+).*/; $1 }
#reading pressure match "Pressure.=.*([-+.,0-9]+).*"
#reading pressure match "%Pressure.=.*([0-9\.]+).*"
#reading pressure match ".*sure.=.([-+.,0-9]+)."
reading pressure match "Pressure[^\n]+\n"
reading pressure postproc { /Pressure.=.([-+.,0-9]+).*/; $1 }

hat aber keine wirklichen Änderungen gebracht, bzw ich seh den Wald vor Bämen nicht mehr  :o
Titel: Antw:ECMD classdef für Arduino BMP280_Sensortest
Beitrag von: Rantanplan am 21 Juli 2022, 10:27:55
hab's umprogrammiert, sodass der serielle output einerseits mit 115200 baut kommt, andererseits als "DevId T30.45 P995.31\r\n" nach https://wiki.fhem.de/wiki/ECMD#Beispiel_DIY_Sensor_via_HC-12 (https://wiki.fhem.de/wiki/ECMD#Beispiel_DIY_Sensor_via_HC-12) ausgewertet werden kann. Und die Daten nur alle 10 sek schickt.
BMP280_Sensortest.ino:
Serial.print("BMP280 ");
Serial.print("T");
Serial.print(temp_event.temperature);
Serial.print((" P"));
Serial.println(pressure_event.pressure);
//15:14:07.164 -> BMP280 T35.48 P1016.27
delay(10000);


hier die bmp280.classdef (define [device_name] ECMDDevice BMP280 BMP280):
params devId
reading temperature match "%devId[^\n]+\n"
reading temperature postproc { /%devId[^T]+T([-+.,0-9]+).*/; $1 }
reading pressure match "%devId[^\n]+\n"
reading pressure postproc { /%devId[^P]+P([-+.,0-9]+).*/; $1 }