Gelöst: Notify - falsches trigger event beim BMP180 ?

Begonnen von Werner, 28 März 2023, 12:03:14

Vorheriges Thema - Nächstes Thema

Werner

Ich will den pressure-Wert vom BMP180 in ein Dummy schreiben mit diesem Code:

BMP180:pressure.* { fhem("set dum_1 ". $EVTPART1 )}
Das funktioniert im Prinzip, nur bekomme ich statt "pressure" den "pressure-nn" geschrieben, der auch laut reading als "triggeredByEvent" ausgelesen wird. Ich vermute, man muß das "-nn" als Trigger abschneiden, aber wie?

TomLee

ZitatIch will den pressure-Wert ...

Dann gib genau das Reading auch an:

BMP180:pressure:.* ...

Werner

#2
ein Doppelpunkt fehlte. Vielen Dank.

Wernieman

Wobei ich mich Grundsätzlich Frage: Wenn Du schon ein fertiges Reading hast, warum willst Du es zusätzlich in ein Dummy copieren?
- Bitte um Input für Output
- When there is a Shell, there is a Way
- Wann war Dein letztes Backup?

Wie man Fragen stellt: https://tty1.net/smart-questions_de.html

Werner

Gute Frage. Das ist nur der Anfang von einem größeren Projekt: Ich puste Luft in meinen Öltank und will den Gegendruck messen
a) den normalen Luftdruck ohne Puste und
b) den Druck nach 3 Sekunden Pusten.

Deswegen brauche ich 2 Werte, einen alten - den im Dummy für den normalen Luftdruck(den hab ich ja jetzt), und dann den neuen mit Druck, der sich je nach Ölstand ändert. Dann will ich mit einem Dreisatz den Ölstand in Zentimetern ausgeben und mir in meiner Morgenansage vorlesen lassen. Letztere funktioniert schon sei längerem und liest mir zum Frühstück diverse Werte von der Heizung vor.

Vielleicht gibt es ja einen genialeren Weg als mit 2 Dummies, aber ich bin eher der Hardware-Bastler als der Programmierer.

Meines Wissens gibt es so einen Füllstandsmesser noch nicht, und da man nur eine ganz dünne Luftleitung in den Tank legen muß, ist das für viele Anwender sich sehr interessant. Ich würde dann einen kompletten Bauplan veröffentlichen.

TomLee

Trag in dem BMP180-Device in dem Attribut oldreadings pressure ein.
In einem userReadings machst die Berechnung, mit der Funktion OldReadingsNum(<devicename>,<reading>, <defaultvalue>,<round>) greifst auf den alten Wert zu und mit ReadingsNum(<devicename>,<reading>, <defaultvalue>,<round>) auf den aktuellen.

Werner

Zitat von: TomLee am 28 März 2023, 15:16:49Trag in dem BMP180-Device in dem Attribut oldreadings pressure ein.
In einem userReadings machst die Berechnung, mit der Funktion

Vielen Dank, klingt einfacher als mit 2 dummies. Das oldreadings pressure habe ich als attr im Device vom BMP180 angelegt.  Jetzt werden die beiden Codezeilen auch als attr dazu geschrieben? ist mir noch nicht ganz klar.  (sorry, auch schon etwas älter...)

TomLee

#7
Beispiel:

attr <deinBMP180-Devicename> userReadings level:pressure.* {return 'Der alte Wert: '.OldReadingsNum($name,'pressure',0).' und der neue Wert: '.ReadingsNum($name,'pressure',0)}

Werner


TomLee

#9
Ich muss im nachhinein zugeben das der Vorschlag OldReadingsNum zu verwenden nicht richtig/zielführend ist und erstmal auf keinen anderen Lösungsansatz (im gleichen Device und ohne zu "tricksen" (userReadings mit sleep und setreading) ) komme.
Mir fehlt irgendwie die Bedingung zu unterscheiden ob mit oder ohne Puste.

Werner

Hallo TomLee,
vielleicht war meine Idee mit den dummies umständlich, aber einfach zu handhaben. Meine ursprüngliche Idee sah so aus:

07:30:00 messe pressure BMP180 und schreibe in dum_1
wait 3
schalte GPIO13 on-for-timer-5 <das ist die Luftpumpe für 5 Sekunden>
wait 3 <damit der Gegendruck stabil ist, muß ich ausprobieren>
messe pressure BMP180 und schreibe in dum_2
berechne differenz dum_2 minus dum_1 <das ist der Gegendrruck der Flüssigkeitssäule> * Faktor <weil Öl ja leichter als Wasser ist>
schreibe das Ergebnis in dum_3 <zur späteren Verwendung, kriege ich als text2speech angesagt um 08:00:00 und als Telegram geschickt>
text2speech und telegram bzw email funktioniert schon seit geraumer Zeit sehr gut.
Wie lege ich den Rechenschritt am sinnvollsten an?

vielen Dank

Ist mein Gedankengang nachvollziehbar?

TomLee

#11
ZitatWie lege ich den Rechenschritt am sinnvollsten an?
Versuchs nochmal  ::)  :D
Verstehe es so, das ist ein AT:

Zitat07:30:00 messe pressure BMP180 und schreibe in dum_1
wait 3
schalte GPIO13 on-for-timer-5 <das ist die Luftpumpe für 5 Sekunden>
wait 3 <damit der Gegendruck stabil ist, muß ich ausprobieren>
messe pressure BMP180 und schreibe in dum_2

Was spricht dagegen die zwei Werte mit unterschiedlichen Namen (bspw. pressure_1 und pressure_2) statt in dummys einfach in das BMP180-Device direkt zu schreiben ( mit setreading)?
Mit einem userReadings (in dem BMP180-Device), welches nur auf pressure_2 triggert (level:pressure_2.* {bla}) die Berechnung zu machen -> differenz pressure_2 (ReadingsNum($name,'pressure_2',0)) minus pressure_1 (ReadingsNum($name,'pressure_1',0)) * Faktor ?

Das 8:00 AT passt dann nur auf das level-Reading an.