Selbstbau-BMP180-Sensor mit LaCrosse 433 MHz Protokoll

Begonnen von juergs, 14 August 2016, 22:19:23

Vorheriges Thema - Nächstes Thema

juergs

hier die Beta-Version mit Arduino Leonardo.
Der BMP180 ist über I2C-Standardbelegung am Leonardo angeschlossen. Der 433MHz-Sender an Port D7.
Er sendet Temperatur und Luftdruck über ID=120. Hex-File ist im Zip enthalten.
Die ATtiny-Version folgt noch.
Da der Luftdruck das LaCrosse-Protokoll etwas überfordert, ziehe ich 1000 mBar vom angezeigten Wert ab.
Die Korrektur zurück, kann in der GPlot-Definition erstellt werden.
https://forum.fhem.de/index.php?topic=24985.0

Aktuelle Implementierung:
http://www.f6fbb.org/domo/sensors/tx3_th.php

Angestrebt:
http://f6fbb.org/domo/sensors/ws7000_20.php

Neueste und aktuelle SW-Version

Zur Verwendung mit 433MHz-CUL.

Siehe auch hier diese Version mit dem Dallas 18B20:
Selbstbau Funkthermometer

Eine mögliche Platine, zum "umfunktionieren":
Bodenfeuchte mit 433-Sender

Jürgen

juergs


juergs

#2
habe mal nach "ReadingsVal" gesucht:
https://forum.fhem.de/index.php/topic,16036.msg104196.html#msg104196

Zitatdefine Temp_AZ dummy
define n_Temp_AZ notify Heiz_AZ_ClimRT_tr:measured-temp.* { fhem("set Temp_AZ ".(ReadingsVal('Heiz_AZ_ClimRT_tr','measured-temp', '10') - 2) ) }

Aber komme auf keinen grünen Zweig. Sorry, bin kein PERL-Ab-Taucher  :-[
Zitatdefine CUL_TX_120 CUL_TX 120
attr CUL_TX_120 room CUL_TX,Plots_OK
define FileLog_CUL_TX_120 FileLog ./log/CUL_TX_120-%Y.log CUL_TX_120
attr FileLog_CUL_TX_120 logtype temp4hum4:Temp/Hum,text
attr FileLog_CUL_TX_120 room CUL_TX
#attr CUL_TX_120 userReadings CUL_TX_120.humidity {ReadingsVal("CUL_TX_120.humidity","Luftdruck", 0)+1000}
define SVG_CUL_TX_120 SVG FileLog_CUL_TX_120:SVG_CUL_TX_120:CURRENT
attr SVG_CUL_TX_120 label "CUL_TX_120 [BMP180] Min $data{min1}, Max $data{max1}, Last $data{currval1}"
attr SVG_CUL_TX_120 room Plots,Plots_OK

Hier das gplot:
# Created by FHEM/98_SVG.pm, 2016-08-15 21:05:29
set terminal png transparent size <SIZE> crop
set output '<OUT>.png'
set xdata time
set timefmt "%Y-%m-%d_%H:%M:%S"
set xlabel " "
set title '<L1>'
set ytics nomirror
set y2tics
set grid y2tics
set ylabel "Luftdruck"
set y2label "Temperatur in C"

#FileLog_CUL_TX_120 4:CUL_TX_120.temperature\x3a:10:
#FileLog_CUL_TX_120 4:CUL_TX_120.humidity\x3a:50:

plot "<IN>" using 1:2 axes x1y2 title 'Temperatur' ls l0 lw 1.5 with lines,\
     "<IN>" using 1:2 axes x1y1 title 'Luftdruck' ls l2 lw 1.5 with lines


Hat jemand eine hilfreiche Idee?

PeMue

probier's mal damit:
attr CUL_TX_120 userReadings CUL_TX_120.humidity { ReadingsVal("CUL_TX_120.humidity","Luftdruck", 0)+1000[b];;[/b] }

Gruß PeMue
RPi3Bv1.2 rpiaddon 1.66 6.0 1xHM-CC-RT-DN 1.4 1xHM-TC-IT-WM 1.1 2xHB-UW-Sen-THPL-O 0.15 1x-I 0.14OTAU  1xCUNO2 1.67 2xEM1000WZ 2xUniroll 1xASH2200 3xHMS100T(F) 1xRFXtrx 90 1xWT440H 3xTFA30.3150 5xFA21
RPi1Bv2 LCDCSM 1.63 5.8 2xMAX HKT 1xMAX RT V200KW1 Heizung Wasser

juergs

#4
Danke, Peter,

jetzt ist mir der Weg klar.

"CUL_TX_120.humidity" steht jetzt auf dem Wert 1000.

Probiere mal "humidity" als Eingangswert ....

Zitatattr CUL_TX_120 userReadings CUL_TX_120.humidity { ReadingsVal("CUL_TX_120.humidity","Luftdruck", 0)+1000;;}

dann:
Zitatattr CUL_TX_120 userReadings CUL_TX_120.humidity { ReadingsVal("humidity","Luftdruck", 0)+1000;;}

dann:
Zitatattr CUL_TX_120 userReadings humidity { ReadingsVal("humidity","Luftdruck", 0)+1000;;}

Die 1000 kommen jetzt ohne Perl-Fehler, müssten aber 1003.0 sein. Irgendwie fehlt der der Eingangswert bei der Addition.

Momentan reicht mir aber die Tendenz ohne Absolutwerte schon aus, probiere morgen weiter.

juergs

#5
https://forum.fhem.de/index.php?topic=19619.0

Hier die Definition von ReadingsVal (nach langem Suchen gefunden):
#ReadingsVal

Daten abfragen/auslesen:
***********
ReadingsVal
***********
   
$value = ReadingsVal($name, $reading, $default)

Die Funktion ReadingsVal() gibt den inhaltlichen Wert des Readings $reading der Definition $name zurück. Sollte das gewünschte Reading nicht existieren, wird $default zurückgegeben.

Parameter:
==========
$name     (mandatory) Der Definitions-Namen aus dem das gewünschte Reading ausgelesen werden soll.
$reading  (mandatory) Der Name des Readings welcher ausgelesen werden soll.
$default  (mandatory) Der Standardwert der zurückgegeben werden soll, sofern das Reading nicht existiert. (can be undef)


Rückgabewert:
=============
Rückgabe Bedeutung
$value Inhalt des gewünschten Readings oder $default, wenn es nicht existiert.

Lucky2k12

#6
Ich bin zwar selbst blutiger Anfänger, aber probier mal folgendes (ungetestet)

attr CUL_TX_120 userReadings humidity_corr[s].*[/s] { ReadingsVal("CUL_TX_120","humidity", 0)+1000.0;;}

Edit: das ".*" Brauchst du, glaub ich, nicht.
HP T610, HM, Jeelink, LGW, mapleCUL868+434

juergs

#7
Hallo Lucky2K12,

war nicht @home, deshalb kann ich erst jetzt weiterprobieren:
1.Versuch:
CUL_TX_120.humidity { ReadingsVal("Luftdruck","humidity", 0)+1000;}
CUL_TX_120.humidity 1000 2016-08-17 21:21:50
CUL_TX_120.press  1000 2016-08-16 21:44:47
humidity 00.9 2016-08-17 19:08:29
state T: 23.6 H: 00.9 2016-08-17 21:21:50
temperature 23.6 2016-08-17 21:21:50


Unglücklicherweise dümpelt der Luftdruck gerade bei 1000 hPa herum.  :(

Den 2. Versuch, wenn wir wieder mit einen Integer über 1000 hPa sind ... :
Zitatattr CUL_TX_120 userReadings humidity_corr.* { ReadingsVal("CUL_TX_120","humidity", 0)+1000.0;;}

Mein eigentlicher Fehler war die Interpretation der ReadingsVal-Parameter, genau falsch herum ...
Vielleicht liegt es auch daran, keine virtuelle Meßstelle sondern eine Reale zu überschreiben ?

Die Definition dafür war aber auch etwas, sagen wir mal "schwer" zu finden...

Die Aussagen zu den Anfragen mit "ReadingsVal" immer recht kurz u. knapp gehalten. (Perl eben ... )
Anmerkung: Nein, will nicht lästern ....  ;D

Jürgen

juergs

#8
Hier zum 1.Versuch, nach "shutdown restart".
Ich warte die Ergebnisse morgen ab.... und hoffe, dass es nicht bei 1000 bleibt.
Es soll ja ein Tiefdruckgebiet in Anmarsch sein ...  ;)

Lucky2k12

Hast du in deinen Plots das neue userreading humidity_corr dargestellt oder eins von deinen vorher angelegten?
Die oben angegebenen Definitionen laufen ins leere, denn die Devices humidity und CUL...humidity gibt's nicht.
Dann wird (vermutlich) der Defaultwert, den du mit 0 angegeben hast genommen und 1000 draufgezählt. 0+1000 bleibt 1000, egal wie der Luftdruck sich entwickelt.
Übrigens apropos Tief: Falls er dann mal unter 1000 fällt, müsste dein Reading negativ werden. Geht schlecht bei einem unsigned int  :o

Die userreadings sind in der commandref schon ein bisschen versteckt, da muss ich dir Recht geben.  :P

userReadings
... Jede Definition hat folgendes Format:  <reading>[:<trigger>] [<modifier>] { <perl code> }
...
Beispiele:  attr myEnergyMeter userReadings energy { ReadingsVal("myEnergyMeter","counters.A",0)/1250.0;; }

also
attr Devicename userReadings
  neuesReading {ReadingsVal("Devicename","altesReading",Defaultwert)+Offsetwert;;}

Das wird dann bei jedem Event aktualisiert, wenn man keinen Trigger angibt. Der Trigger könnte bei dir dann auch :humidity.* lauten, dann würde es nur bei einer Änderung des readings humidity neu berechnet, soweit ich das verstanden habe.
HP T610, HM, Jeelink, LGW, mapleCUL868+434

juergs

#10
Hallo Lucky2K12,

ZitatGeht schlecht bei einem unsigned int 
worauf bezog sich das?
Habe deshalb auch nochmal nachgeprüft:
ZitatTemp.: 23.6 Druck: 998.86
Oho! Liefert leider:
ZitatSTATE T: 23.6 H: 00.7
Da muss ich mir noch mal  Source + Protokoll anschauen.
Evtl. ist es besser auf  dieses Protokoll zu gehen: "Protocol of the Lacrosse WS7000-20 meteo sensor".
Die machen da den Trick, dass sie noch 200 hPa dazudaddieren um in jedem Fall positiv zu bleiben....
Mit offset von + offset 200 hPa:
[temp] 25.5 deg - [hygro] 49.6 % - [press] 794 hPa (+ offset 200 hPa)

Also nur 800 hPA statt 1000 hPa subtrahieren, dann bleibt das Ergebnis positiv.

Wenn die Werte richtig durchkommen, schaue ich wieder auf die readings.

Danke für den Hinweis + Grüße
Jürgen






juergs

#11
Hier noch das jetzt endlich funktionierende ReadingsVal:
:) :) :)

attr CUL_TX_120 userReadings CUL_TX_120.press { ReadingsVal("CUL_TX_120","humidity", 0)+800;;}

mit:




CUL_TX_120.press = neue "virtuelle" Messtelle
CUL_TX_120 = das Device
humidity = reale Meßstelle (Besonderheit: steht im Log, nicht in der Definition)

hier die richtige Stelle im Wiki: #ReadingsVal
oder Creating_Plots

Mit dieser Defintion:

define CUL_TX_120 CUL_TX 120
attr CUL_TX_120 room CUL_TX,Plots_OK
define FileLog_CUL_TX_120 FileLog ./log/CUL_TX_120-%Y.log CUL_TX_120
attr FileLog_CUL_TX_120 logtype temp4hum4:Temp/Hum,text
attr FileLog_CUL_TX_120 room CUL_TX

temperature und humidity stehen im Logfile und werden wohl von der FHEM-LaCrosse-Verarbeitung so geliefert.
Für diese Messung, Rohwerte über die serielle Schnittstelle (ohne Subtraktion von 800 hPA für Sende-Protokoll):

Temp.: 23.6 Druck: 998.99

Sorry, es stimmt also das Sende-Protokoll noch nicht für Werte unter 1000 hPa. Checke das nochmal durch,
nachdem mir das Wetter den Gefallen des falldenden Luftdruckes getan hat (;-))

Vielleicht wäre es auch sinnvoller, dann gleich dieses Protokoll zu implementieren ...
http://f6fbb.org/domo/sensors/ws7000_20.php und die Luftfeuchte gleich noch mitzuliefern (DHT).
Beispiel:
Zitat[temp] 25.5 deg - [hygro] 49.6 % - [press] 794 hPa (+ offset 200 hPa)

Lucky2k12

Super, dass sieht doch schon viel besser aus  8)
Jetzt muss nur noch das "pressure" reading übermittelt werden, dann musst du den Luftdruck nicht mehr aus der Feuchtigkeit berechnen ;D
HP T610, HM, Jeelink, LGW, mapleCUL868+434

juergs

#13
Danke! So sieht's aus.  8)  für ein schnelles Sonntags-Spät-Abends-Projekt ...
... und draußen regnet es ...

rtl_433
TX29
Decodage-capteur-thermo-hygro-TFA
Dekodieren

Lucky2k12

Zitat von: juergs am 18 August 2016, 19:32:48
worauf bezog sich das?
Hallo Jürgen,
das mit dem unsigned int bezog sich auf eine potenzielle Fehlermöglichkeit, (da fehlt ein z.B.). Ist wohl eine Berufskrankheit, immer Fehlermöglichkeiten im Hinterkopf zu haben  ;D

In deinem Code verwendest du ja float, aber in den diversen Codeschnipseln wird auch viel int verwendet, ich hab mich da nicht im einzelnen durchgewühlt...
HP T610, HM, Jeelink, LGW, mapleCUL868+434