Funksensor mit Bosch sensortec BME680 / Luftgüte

Begonnen von juergs, 28 Oktober 2017, 18:05:43

Vorheriges Thema - Nächstes Thema

juergs

Seit einiger Zeit beobachte ich das Geschehen um CO2/VOC-Luftgüte-Sensoren, auch um den relativ neuen BME680 Sensor von Bosch sensortec,
mit diesen Eckdaten:
Zitat
    Bosch BME680 Integrated Environmental Sensor (Air Quality, Humidity, Pressure and Temperature)
    Temperature Sensor -40...85°C
    Pressure Sensor 300...1100hPa (+9000...-500m above/below sea level)
    Humidity Sensor 0...100%
        Accuracy tolerance: +/-3 % relative
        Hysteresis: <1.5% relative
    Gas Sensor for Air Quality (IAQ)
    SPI Interface (up to 10MHz)
    TWI/I2C Interface (address 0x76 when SDO=0 or 0x77 when SDO=1, CS=1 for I2C)
    3.3V - 5V Power Supply and Logic Level

Hardware: BME680-Breakout oder nur 3V3-Typ oshpark DIY

Da es aber Softwaremässig eher bescheiden um den Sensor bestellt ist, möchte ich Euch mein Projekt
schon in der Anfangsphase vorstellen.

Die von Sensortec vorgestellte Software BME680_driver ist durchaus etwas
zu "kompliziert", umfangreich und zu allgemein gehalten, um gleichzeitig auch in die Tiefen von I2C und dem Sensor einzusteigen.
Deshalb hier erst mal die "einfachere" Lösung mit Breakboard und Arduino NANO um in das Thema einzusteigen.

Software:

1. Schritt: Implementierung der Grundfunktionalität für das Breakout-Board.

Hardware setup:
VCC ----------------------- NANO.5V
SDA ----------------------- NANO.A4 = PC5
SCL ----------------------- NANO.A5 = PC4
CS ------------------------ High (select i2c-Interface)
GND ----------------------- NANO.GND


Erstes-Ergebnis:

ZitatOpening port
Port open
Scanning...
Ok, I2C device found at address 0x77  !
done

BME680 I am: 61 I should be 61

Calibration coeficients:
dig_T1 =26583
dig_T2 =26571
dig_T3 =3
dig_P1 =35016
dig_P2 =-10322
dig_P3 =88
dig_P4 =5660
dig_P5 =17
dig_P6 =30
dig_P7 =19
dig_P8 =200
dig_P9 =-3762
dig_P10 =30
dig_H1 =773
dig_H2 =1011
dig_H3 =0
dig_H4 =45
dig_H5 =20
dig_H6 =120
dig_H7 =-100
dig_GH1 =-29
dig_GH2 =-13303
dig_GH3 =18
gas wait time = 0x59
resistance Heat = 20
CTRL_GAS_1 = 0x10
gas wait = 0x59
res heat = 0x20
New data in field 0!
Gas measurement Index = 0
gas range = 4
BME680:
Altimeter temperature = 21.84 C
Altimeter temperature = 71.31 F
Altimeter pressure = 1007.93 mbar
Altitude = 145.55 feet
Altimeter humidity = 49.0 %rH
Gas Sensor raw resistance = 0
Gas Sensor resistance = 806516.4 Ohm

New data in field 0!
Gas measurement Index = 0
Field 0 gas data valid

Gas measurement Index = 0
Field 0 gas data valid
gas range = 0
BME680:
temperature = 21.87 C
temperature = 71.37 F
pressure = 1007.85 mbar
Altitude = 147.74 feet
humidity = 48.9 %rH
Gas Sensor raw resistance = 0
Gas Sensor resistance = 12917166.0 Ohm


2. Schritt: Abwägen der existierenden Libraries.
Hier die Library für das Breakout-Board:
BME680_Library. Das ist der gesuchte Wrapper um den (original)  BME680_driver

In "BME680_V2" hab ich die BME680-Library zusammen gepackt und etwas "angepasst".

3.Schritt. Umschwenken auf BSEC mit dem ESP8266(nodeMCU)
macht noch Ärgen mit fiesem WDT-Fehler ... Erst mal ausgesetzt.

4. Schritt: Datenübertragung mittels Standard- 433MHz-OOK-Sender an FHEM:
Der Prototyp mit 433 MHz Lacrosse Protokoll ist fertig.
Der Sender wird an D13 angeschlossen, wenn D10 gegen GND gejumpert wird dann zeigt der Serial-Output auch ein Timestamp an.
Der CO2-Wert pegelt sich bei mir um die 120.000 ein, deshalb teile ich dur 10.000 um in den übertragbaren Wertebereich zu kommen.
Die Datenübermittling wird per Interrupt alle 30 Sekunden übertragen, da sich heraus gestellt hat, dass der Sensor häufiger abgefragt werden muss,
wohl um seine Betriebstemperatur zu stablisieren...     

Der Sensor baut zwei Devices auf:
ID 100 - Kanal 1: Temperatur
             Kanal 2: Luftfeuchte
ID 101-  Kanal 1: CO2 Widerstand als Roh-Sensor-Wert
             Kanal 2: als gemittelter Sensorwert.

Hardware:



D13 => 433MHz-OOK-Modul-DATA-Pin
D10 => Jumper gegen GND = Debugausgaben mit Text, offen = nur Zahlen für Plotanzeige

Die Werte für Temperatur, Luftfeuchte sind nicht gemittelt. Den Luftdruck habe ich erst mal zu Gunsten
der CO2-Ausgabe geopfert. In Zukunft wird sich aber der gemittelte Wert eher anbieten.
Dann werde ich den Luftdruck mit übertragen.
Das ist mal die erste Variante mit einem Nano, bis ich den WDT-Fehler beim ESP gefunden habe.
Evtl. lassen sich dann auch die Relation Richtung IAQ und ppm finden ...
Verbesserte Variante in der Version 2.1.

Schritt 5: Einbindung AMS iAQ-core Sensor, der ebenfall Resistance, CO2 [ in ppm] und tvoc - nach intern implementierten Algorithmus schon überarbeitete Daten liefert.
Um die Ausgaben des BME680 korrelieren zu können. Ebenfalls Einbindung über TX3-LaCrosse-Protokoll bis dato.
Den passenden Code "iAQ-NANO-LACROSSE-TX3" dazu habe ich hier hier bei Github veröffentlicht.

Schritt 6: Überarbeitung des BME680-Codes und Anpassung auf den ESP8266, um die Ausreißer-Werte und das nervige WDT-Problem zu eliminieren ...

/edit 20181226: Implementierung als "UniversalSensor" mit RFM69CW/868Mhz und LaCrosseGateway: https://forum.fhem.de/index.php/topic,78619.msg876544.html#msg876544

/edit 20190430: Einbindung BME680 in OLED-Wetterstation mit TFT-Display.

/edit 20190921: Implementierung mit ESPEasy (MQTT + SLINK) + WLAN. Mit entsprechender Konfigurationsmöglichkeiten und Filterung.   
https://forum.fhem.de/index.php/topic,78619.msg974829.html#msg974829 und
hier: https://forum.fhem.de/index.php/topic,78619.msg984732.html#msg984732
ESPEasy-Code + Erläuterungen dazu: https://github.com/juergs/ESPEasy_BME680_TVOC
Für UDP-SLINK-Betrieb ein define slink SLink für Device autocreate definieren.
Für MQTT2 ein mqtt2_client-Device definieren:
Internals:
   BUF       
   DEF        127.0.0.1:1883
   DeviceName 127.0.0.1:1883
   FD         4
   FUUID      5d96097a-f33f-xxxx-9d65-6809e95ca4eddf32
   NAME       mqtt2_client
   NR         144
   PARTIAL   
   STATE      opened
   TYPE       MQTT2_CLIENT
   WBCallback
   clientId   mqtt2_client
   lastMsgTime 1570286545.49909
   nextOpenDelay 5
   READINGS:
     2019-10-03 17:57:11   state           opened
Attributes:
   room       MQTT2_DEVICE


Basierend auf diesem Device den MQTT2_CLIENT mit entsprechenden Topic-RegEx definieren:
ZitatInternals:
   CID        mqtt2_client
   DEF        mqtt2_client
   DEVICETOPIC MQTT2_mqtt2_client
   FUUID      5d83c849-f33f-72b0-xxxx-d8648a4fbbcc7191
   IODev      mqtt2_client
   LASTInputDev mqtt2_client
   MSGCNT     11296
   NAME       MQTT2_mqtt2_client
   NR         131
   STATE      ???
   TYPE       MQTT2_DEVICE
   mqtt2_client_MSGCNT 11296
   mqtt2_client_TIME 2019-10-05 16:44:20
   READINGS:
     2019-10-05 10:44:59   ESP_Easy        connected!
     2019-10-05 16:44:20   Humidity        48.1
     2019-10-05 16:44:20   Pressure        999.1
     2019-10-05 16:44:20   TVOC            259.6
     2019-10-05 16:44:20   Temperature     20.1
Attributes:
   IODev      mqtt2_client
   disable    0
   readingList mqtt2_client:fhem/out/LWT:.* LWT
mqtt2_client:Test/Temp:.* Temp
mqtt2_client:Connect:.* Connect
mqtt2_client:ESP_Easy:.* ESP_Easy
mqtt2_client:ESP_Easy/bme680/Temperature:.* Temperature
mqtt2_client:ESP_Easy/bme680/Humidity:.* Humidity
mqtt2_client:ESP_Easy/bme680/Pressure:.* Pressure
mqtt2_client:ESP_Easy/bme680/TVOC:.* TVOC
   room       MQTT2_DEVICE

Regex basierend auf MQTT-Definitionen im ESP_Easy-Device in der MQTT-Definitin der zu übertragenden Meßwerten:
Attribute: readingList

mqtt2_client:fhem/out/LWT:.* LWT
mqtt2_client:Test/Temp:.* Temp
mqtt2_client:Connect:.* Connect
mqtt2_client:ESP_Easy:.* ESP_Easy
mqtt2_client:ESP_Easy/bme680/Temperature:.* Temperature
mqtt2_client:ESP_Easy/bme680/Humidity:.* Humidity
mqtt2_client:ESP_Easy/bme680/Pressure:.* Pressure
mqtt2_client:ESP_Easy/bme680/TVOC:.* TVOC


/edit 20230115
1.) FHEM-Implementierung mit CC-Modul:
CustomSensor-Implementierung (@hdgucken) mittels LaCrosse-Gateway:
Zusammenfassung bzw. letzter Stand der CustomSensor (CC)-Implementierung und erforderliche FHEM-Module.
Hinweis: Diese Module sind nicht Bestandteile des aktuellen FHEM-Repositorys und könnten bei einem Update überschrieben werden!
Deshalb lohnt es sich immer ein Backup davon in Reserve zu halten!  :(
In der noch aktuell + letzten Version befinden sich alle Sketche, Bins und Module in der angehängten Zip-Datei: BME680_CC_SENSOR

Achtung: Auto-Erkennung der CCs ist in den Modulen nicht implementiert. D.h. manuell die Definition der CC-Devices selbst manuell in der Fhem-Kommando-Zeile anlegen!
Beispiel der Konfiguration ist in der Zip-Datei enthalten. Die Dateien sind nach der übertragung noch auf User/Gruppe fhem/dialout mittels
Zitatsudo chown fhem:dialout 36_*.pm
zu ändern.

2.) FHEM-Implementierung mit SLINK-Modulen über WLAN/LAN mit ESPEasy
siehe Beschreibung:  /edit 20190921
[/list]

HCS

Eventuell sollten wir uns zusammentun.
Ich bin gerade hier
https://forum.fhem.de/index.php/topic,78128.msg700815.html#msg700815
dabei, den BME680 in das LaCrosseGateway zu integrieren.

Das läuft so weit auch schon, nur die Umrechnung des Widerstandswerts in die IAQ, fehlt noch.
Die Formel verrät Bosch seltsamerweise nicht.

juergs

Hallo HCS,
Danke fürs Feedback.

Für mich war heute erst Mal die Anbindung über I2C wichtig.
Morgen schaue ich mir Mal die Driver_FW genauer zu dem Thema an.

Hast Du schon einen weiteren SW-Stand?
Da können wir gerne zusammen kommen.  :-)

Grüße
Jürgen

PeMue

Hallo zusammen,

ich bin gerade am Komplettieren meines nano LGWs. Dauer leider ein bisschen, weil zu viele (unversandte) Platinen und Zeugs rumliegen  :(

Gruß Peter
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
Hier die Arduino-Library für das Breakout-Board:
BME680_Library. Das ist der gesuchte Wrapper um den BME680_driver. Sowie Beispiele dazu.
Ebenfalls hier und hier.

KölnSolar

Feines Projekt ! Freue mich auf Fortschritte und Endergebnis. Bin selber zu verhaftet in Betty, Samsung, Feinstaub.... und letzteres als Innensensor. Den BME680 direkt an den Wemos anschließen ?
Grüße Markus
RPi3/2 buster/stretch-SamsungAV_E/N-RFXTRX-IT-RSL-NC5462-Oregon-CUL433-GT-TMBBQ-01e-CUL868-FS20-EMGZ-1W(GPIO)-DS18B20-CO2-USBRS232-USBRS422-Betty_Boop-EchoDot-OBIS(Easymeter-Q3/EMH-KW8)-PCA301(S'duino)-Deebot(mqtt2)-zigbee2mqtt

juergs

#6
Hallo Markus,

ZitatDen BME680 direkt an den Wemos anschließen
das wird gehen.

Habe mich aber noch nicht auf ein Transport-Medium festgelegt.
Hier gibt es z.B. ja auch noch: Vorgänger-Threads und hier AMS-IAQ
oder CUL_TX, Asksin, LGW, ESP etc. (mal schauen, zum gegebenen Zeitpunkt, was für FHEM mehr Sinn macht.)

juergs

#7
Hier die Version mit der "Orginal"-Lib basierend auf dem sensortec-Code.
Habe alles in ein Verzeichnis gelegt um ein eigenständiges Projekt (ohne Arduino-Repository-Verweise) zu erzeugen.
In den Libs musste ich noch einiges anpasssen, dass sie unter VisualMicro compiliert werden können,
bzw. nicht dauernd Fehler (zB. int8_t unbekannt) anzeigen.

ZitatOpening port
Port open
BME Initialization...Succeeded!
Configuring Forced Mode...Succeeded!
Temperature(degC),Relative_Humidity(%),Pressure(hPa),Gas_Resistance(Ohms)
22.57,51.37,1004.47,0
22.72,51.43,1004.21,121377
22.69,51.30,1004.25,125656
22.66,51.26,1004.29,127570
22.65,51.27,1004.35,128451
22.63,51.27,1004.37,128648
Einige Dinge kann klar noch noch verbessern: z.B. die Normalisierung des Luftdrucks auf Meereshöhe ...
Diese Lib scheint die bessere Version zu sein. Jetzt geht es erst ma wieder ans Datenblatt um wie HCS schon erwähnte
die Bedeutung der Widerstandswerte herauszufinden und ob der Forced-Mode die richtige Betriebsvariante ist.

juergs

#8
Nach Durchlesen der BME680-Dokumentation, werden Lösungen mit zwei "Ausbaustufen" : IAQ + ALL
mit den entsprechenden Algorithmen als Arduino-Code. (siehe S.21, Datasheet)  :)

BSEC-code "Bosch Sensortec Environmental Cluster"

bsec_integration.c
bsec_integration.h
bsec_iot_example.c
bsec_iot_example.ino
doc_bsec_step_by_step.md


Zitat
C:.
├───algo
│   └───bin
│       ├───ARM_CORTEX
│       │   ├───ARMCC
│       │   │   └───IAQ_OUT
│       │   │       ├───Cortex_M0
│       │   │       ├───Cortex_M0+
│       │   │       ├───Cortex_M3
│       │   │       ├───Cortex_M4
│       │   │       └───Cortex_M4F
│       │   └───GCC
│       │       └───IAQ_OUT
│       │           ├───Cortex_M0
│       │           ├───Cortex_M0+
│       │           ├───Cortex_M3
│       │           ├───Cortex_M4
│       │           └───Cortex_M4F
│       ├───ESP8266
│       └───RL78
├───API
├───config
│   └───iot_lp_3_3v
├───Doc
└───example


Zitat- Available binaries for download - ARM CortexM0+,M3,M4,M4F,x86,x64
... und Arduino mit ESP  ;)

@HCS:
Hier sollte die Vorgehensweise der Umrechnung beschrieben sein (siehe auch S.9 + 18ff. Datasheet) :

Zitat[300345.00] T: 33.30| rH: 22.73| IAQ: 25.00 (3)
[303346.00] T: 33.30| rH: 22.76| IAQ: 26.30 (3)
[306346.00] T: 33.26| rH: 22.81| IAQ: 27.90 (3)
[309346.00] T: 33.26| rH: 22.84| IAQ: 19.72 (3)
[312346.00] T: 33.20| rH: 22.93| IAQ: 25.02 (3)
[315346.00] T: 33.19| rH: 22.94| IAQ: 20.70 (3)
[318346.00] T: 33.14| rH: 22.97| IAQ: 28.80 (3)

=>Widerstandswert
=> IAQ_Index [0-50,51-100,101-150,151-200,201,300,301-500] 
=> Air_Quality [good,average,little bad, bad, worse, very bad]

Aber: CO2-LED-Ampelanzeige: (bis 800 ppm: grün, 800-1200 ppm: gelb, über 1200 ppm: rot)

Mal schauen... und den "BSECIntegrationGuide" (PDF im \Doc-Verzeichnis) durchwälzen...

HCS

Zitat von: juergs am 29 Oktober 2017, 14:09:57
... und Arduino mit ESP  ;)
Hast Du eine Idee, wie man die libalgobsec.a einbindet?
Meiner Meinung nach gibt es die Berechnung der IAQ nur in precompiled libs.
https://github.com/BoschSensortec/BME680_driver/issues/6#issuecomment-337134651

Zitat von: juergs am 29 Oktober 2017, 14:09:57
Hier sollte die Vorgehensweise der Umrechnung beschrieben sein (siehe auch S.9 + 18ff. Datasheet) :
Das beschreibt nur, wie man den Senosr heizt und den Widerstandswert ausliest und berechnet.
Aber nicht, wie die IAQ daraus berechnet wird.

juergs

#10
Hallo HCS,

ja sieht in der Tat so aus:

Zitatbsec_do_steps()
scheint nur in den precompiled libs zu existieren.
Dort werden die IAQ Berechnungen durchgeführt ...

Ich muss mich durch den "BSEC Integration Guide" duchkämpfen.
Was mich wundert ist, dass ein explizites Arduino-Beispiel mitgeliefert wird.

So eine adhoc Idee wäre, durch Referenzmessungen, sich einfach eine Funktion zu erstellen, welche
die Widerstandswerte in die IAQ-Kategorien umwandelt. (airco2ntrol)

Vielleicht hast Du da schon mehr Erfahrungswerte in Bezug auf der Widerstands-Ausgabe ?

Letztendlich kommt es da nicht auf den IAQ-Absolutwert an (?) ...



HCS

Zitat von: juergs am 29 Oktober 2017, 18:33:10
Vielleicht hast Du da schon mehr Erfahrungswerte in Bezug auf der Widerstands-Ausgabe ?
Ein wenig. Siehe hier: https://forum.fhem.de/index.php/topic,78128.msg700815.html#msg700815
Ich kann zumindest ablesen (angehängtes Chart), wann meine Frau gekocht hat und wann gelüftet wurde.
Ich müsste mal die Fenster zu lassen, bis ich umkippe, um den Grenzwert zu ermitteln  ;D ;D

Zitat von: juergs am 29 Oktober 2017, 18:33:10
Letzendlich kommt es da nicht auf den IAQ-Absolutwert an (?) ...
Denke ich auch. Wir brauchen ja nicht unbedingt eine "Bosch-Kompatible" IAQ, wenn die nicht verraten wollen, wie man sie berechnet.

juergs

#12
ZitatIAQ, wenn die nicht verraten wollen, wie man sie berechnet.

Ja, magic...  und ein riesen Aufwand für das Framework.
Die scheinen Angst vor den Chinesen zu haben ...  :( :( :(

Über den "gas_range" scheint die Werteausgabe  auch nicht kontinuierlich zu sein. (Siehe Seite 20, Tabelle 12) ...

Dann baue ich mal die Chart-Ausgabe für die Arduino-IDE ein und analysiere die Ergebnisse wie hier und hier mit Modul
vielleicht auch parallel mit dem IAQ-Sensor von AMS.

KölnSolar

ZitatIch müsste mal die Fenster zu lassen, bis ich umkippe, um den Grenzwert zu ermitteln  
Beim CO2-Sensor(Velux etc.) genügen 1-2 Zigaretten  ;)
RPi3/2 buster/stretch-SamsungAV_E/N-RFXTRX-IT-RSL-NC5462-Oregon-CUL433-GT-TMBBQ-01e-CUL868-FS20-EMGZ-1W(GPIO)-DS18B20-CO2-USBRS232-USBRS422-Betty_Boop-EchoDot-OBIS(Easymeter-Q3/EMH-KW8)-PCA301(S'duino)-Deebot(mqtt2)-zigbee2mqtt

juergs

#14
Zitatgenügen 1-2 Zigaretten
Das beste Beispiel für VOCs (Organic Volatile Compounds)  :)

CO2-LED-Ampelanzeige: (bis 800 ppm: grün, 800-1200 ppm: gelb, über 1200 ppm: rot)