Pressure Sensor BMP180 am I2C des RasPi

Begonnen von C64Emulator, 05 Juni 2013, 10:05:44

Vorheriges Thema - Nächstes Thema

C64Emulator

Hallo zusammen,
ich habe den Luftdrucksensor BMP180 von Bosch an den I2C des RasPi angeschlossen und kann nun den Luftdruck messen. Es hat mich schon immer gestört, dass es von ELV keine Sensoren dafür gab.
Da ich auch einen COC-Radio_only habe, habe ich es auf die COC-Erweiterung gelötet.
Vorher:

(siehe Anhang / see attachement)

Nachher:

(siehe Anhang / see attachement)

Schön ist anders...Die Lötfähigkeiten sind etwas eingerostet, mit der Feinmotorik habert es ein bisserl...

Softwaremäßig habe ich einen "normalen" Raspbian-Kernel ohne Busware-Erweiterungen. Das war auch mein Ziel, ich will jederzeit die Updates des Raspbian mitmachen können, ohne jedesmal den Kernel kompilieren zu müssen. Das funktioniert ganz gut. Der COC wird erkannt:

pi@RPi-FHEM ~ $ i2cdump -y 1 0x50 b
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef
00: 43 4f 43 20 56 31 2e 31 20 52 41 44 49 4f 20 4f    COC V1.1 RADIO O
10: 4e 4c 59 20 32 30 31 33 2d 30 31 2d 31 39 0a ff    NLY 2013-01-19?.
20: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................
30: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................
40: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................
50: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................
60: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................
70: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................
80: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................
90: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................
a0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................
b0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................
c0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................
d0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................
e0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................
f0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................

Der BMP180 hat die I2C-Adresse 0x77:

pi@RPi-FHEM ~ $ i2cdetect -y 1
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: 50 -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- 77
pi@RPi-FHEM ~ $


Jetzt würde ich natürlich gerne die Werte in FHEM haben. Es gibt ein gute Tutorial mit Beispielcode hier: http://learn.adafruit.com/downloads/pdf/using-the-bmp085-with-raspberry-pi.pdf (BMP085 ist der kompatible Vorgänger des BMP180).

Damit bekomme ich immerhin schon Werte:
pi@RPi-FHEM ~ $ sudo python Adafruit_BMP085_example.py
Temperature: 38.90 C
Pressure:    1003.33 hPa
Altitude:    82.75
pi@RPi-FHEM ~ $


Hat jemand Interesse, mir dabei zu helfen, den Python-code nach Perl zu portieren und in FHEM als Modul bereitzustellen? Das ist mir zu hoch.

Grüße
Helmut.


Puschel74

Hallo,

wenn du die Befehle kennst um den Sensor abzufragen sollte das aus FHEM heraus das kleinere Problem sein.

Grüße
Zotac BI323 als Server mit DBLog
CUNO für FHT80B, 3 HM-Lan per vCCU, RasPi mit CUL433 für Somfy-Rollo (F2F), RasPi mit I2C(LM75) (F2F), RasPi für Panstamp+Vegetronix +SONOS(F2F)
Ich beantworte keine Supportanfragen per PM! Bitte im Forum suchen oder einen Beitrag erstellen.

C64Emulator

Hallo,

Zitat von: Puschel74 schrieb am Mi, 05 Juni 2013 10:12wenn du die Befehle kennst um den Sensor abzufragen sollte das aus FHEM heraus das kleinere Problem sein.

Naja, einen Wrapper für den Python-Code bekomme ich auch hin.

Aber das wollte ich eigentlich nicht. Es gab doch mal eine Initiative, aus FHEM den I2C in Perl anzusprechen (-> PAH). Was ist denn daraus geworden?

Gruß
Helmut.

Puschel74

Hallo,

das meinte ich damit.

Wenn du den Sensor von der RasPi Kommandozeile abfragen kannst und sinnvolle Werte zurück bekommst kannst du dich dran machen und
die Abfrage und die Werte in fhem zu bringen.

So mache ich es mit meine Temperatursensoren am I2C-Bus des RasPi.

Grüße
Zotac BI323 als Server mit DBLog
CUNO für FHT80B, 3 HM-Lan per vCCU, RasPi mit CUL433 für Somfy-Rollo (F2F), RasPi mit I2C(LM75) (F2F), RasPi für Panstamp+Vegetronix +SONOS(F2F)
Ich beantworte keine Supportanfragen per PM! Bitte im Forum suchen oder einen Beitrag erstellen.

C64Emulator

Hallo,
Zitat von: Puschel74 schrieb am Mi, 05 Juni 2013 10:48Wenn du den Sensor von der RasPi Kommandozeile abfragen kannst und sinnvolle Werte zurück bekommst kannst du dich dran machen und die Abfrage und die Werte in fhem zu bringen.
Ich habe mich drangemacht. Der Sensor ist jetzt seit einer Woche in FHEM integriert.
Ich habe den Beispielcode nicht nach Perl portiert, da mit den Rohdaten des Sensors etwas komplizerte Umrechnungen durchgeführt werden müssen. Da ist erprobter Code sinnvoller.
Allerdings habe ich nicht das Python-Skript genommen, sondern ein kleines C-Programm von http://www.john.geek.nz/2013/02/update-bosch-bmp085-source-raspberry-pi/.
Grund: der Ressourcenverbrauch ist geringer:
pi@RPi-FHEM ~ $ time sudo python Adafruit_BMP085_example.py
Temperature: 47.60 C
Pressure:    1004.55 hPa
Altitude:    72.85

real    0m0.347s
user    0m0.210s
sys     0m0.050s
pi@RPi-FHEM ~ $

Zum Vergleich:
pi@RPi-FHEM ~ $ time sudo ./readBMP180
Temperature: 47.6 °C  Pressure: 1004.58 hPa

real    0m0.101s
user    0m0.010s
sys     0m0.030s
pi@RPi-FHEM ~ $

Der Unterschied ist aber nur akademisch...

Um die Werte besser parsen zu können, habe ich allerdings die Ausgabe des C-Programms modifiziert:
 // alt: printf("Temperature\t%0.1f%cC\n", ((double)temperature)/10,0x00B0);
  // alt: printf("Pressure\t%0.2f hPa\n", ((double)pressure)/100);
  printf("Temperature: %0.1f °C  Pressure: %0.2f hPa\n", ((double)temperature)/10, ((double)pressure)/100);

Der I2C-Bus ist übrigens hardcoded, der I2C-Bus muss natürlich richtig gesetzt sein.
Die Werte werden alle 10min. beim Sensor abgeholt, die fhem.cfg schaut so aus:
#   pressure sensor BMP180
define pressure.livingroom dummy
attr pressure.livingroom loglevel 1
attr pressure.livingroom room Wohnzimmer
define FileLog_pressure.livingroom FileLog ./log/pressure.livingroom-%Y.log pressure.livingroom
attr FileLog_pressure.livingroom logtype pressure:pressure,text
define weblink_pressure.livingroom weblink fileplot FileLog_pressure.livingroom:pressure:CURRENT
attr weblink_pressure.livingroom label "pressure.livingroom Min $data{min1}, Max $data{max1}, Last $data{currval1}"
attr weblink_pressure.livingroom room Plots
define n_Sensor_BMP180_read notify n_Sensor_BMP180_read { readSensor_BMP180() }
attr n_Sensor_BMP180_read loglevel 1
define t_Sensor_BMP180_read at +*00:10:00 trigger n_Sensor_BMP180_read

Der Sensorausleser wird aus 99_myUtils.pm aufgerufen:
sub readSensor_BMP180 () {
       # Return from systemcall: "Temperature: 39.3 °C  Pressure: 1003.32 hPa"
       my $result = qx( /opt/fhem/readBMP180 );
#       Log 1, "notify-readBMP180: " . $result;
       my ($sensor_temp, $sensor_press) = split /Pressure: /, "$result", 2;
#       Log 1, "notify: sensor_temp: " . $sensor_temp . " sensor_press: " . $sensor_press;
       my ($press_val, $press_unit) = split /\ /, "$sensor_press", 2;
#       Log 1, "notify: press_val: " . $press_val . " press_unit: " . $press_unit;
       fhem("set pressure.livingroom $press_val");
}

Zum Schluss noch die Definition für gplot:
############################
# Display the air pressure
#

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 ylabel "pressure [hPa]"

#FileLog 3:pressure:0:

plot axes x1y1 title 'pressure' with lines

Viel Spaß beim Nachmachen!
Helmut.

Dirk

Ich habe da mal was gebastelt :)
Link

Gruß
Dirk

Dirk

Hi Helmut,

Zitat von: C64Emulator schrieb am Mi, 05 Juni 2013 10:05Hat jemand Interesse, mir dabei zu helfen, den Python-code nach Perl zu portieren und in FHEM als Modul bereitzustellen? Das ist mir zu hoch.
Ich würde mich in den nächsten Tagen da mal dran setzen. Könne man theoretisch auch einfach als Funktion in 99_myUtils.pm einbauen. Oder doch lieber ein eigenes Modul?

Gruß
Dirk

betateilchen

Nur für die Druckberechnung ist ein Modul vielleicht ein bißchen Overkill.  Ein Modul wäre eine prima Sache, um den I2C Bus generell abzuhandeln. Dort könnte man dann ggf. auch Deine sub() aus der 99_myUtils integrieren. Mal sehen, der nächste Winter mit langen Abenden kommt bestimmt...
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Dirk

Hi betateilchen,

ich habe nun doch ein Modul gebaut:
http://forum.fhem.de/index.php?t=msg&goto=86827&rid=42#msg_86827

ZitatEin Modul wäre eine prima Sache, um den I2C Bus generell abzuhandeln.
Das ging dann so einfach, dass ich das ein bißchen Overkill fand :)

Aber wir können das Ganze ja weiterentwickeln.

Viele Grüße
Dirk