ECMD classdef für Arduino BMP280_Sensortest

Begonnen von Rantanplan, 19 Juli 2022, 10:09:46

Vorheriges Thema - Nächstes Thema

Rantanplan

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

Beta-User

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"
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

Rantanplan

#2
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 }


Beta-User

Klingt für mich danach, als solltest du dir die "split"- und (vielleicht?) "partial"-Attribute ansehen.
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

Rantanplan

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)"?

Beta-User

#5
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).
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

Rantanplan

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.?

Beta-User

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...
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

Rantanplan

ich will den original Code benutzen, das ist nicht möglich.
hat denn ein "partial 0.5" eine Wirkung?

Beta-User

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").
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

Rantanplan

zunächst:

  • read T (\124) und read \n (\012) triggern denselben regex  :o
  • das Device reading für pressure wird gesetzt, aber als "Pressure = 1016.13hPa" (oftmals wird nur Pressure = 1 gesetzt)
  • split reagiert mit \r|\n wobei das sicher nicht sauber ist, nur ein Tip

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

Rantanplan

#11
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 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 }