From d1b9019887208686c9b9f608df4c7a70d487f30d Mon Sep 17 00:00:00 2001
From: Jan Grewe <jan@faked.org>
Date: Tue, 25 Oct 2022 19:54:33 +0200
Subject: [PATCH] add SCD40 add MLX90614

---
 growbox.yaml           |  2 ++
 include/mlx90614.h     | 28 ++++++++++++++++++++++++++++
 packages/mlx90614.yaml | 34 ++++++++++++++++++++++++++++++++++
 packages/scd40.yaml    | 22 ++++++++++++++++++++++
 4 files changed, 86 insertions(+)
 create mode 100644 include/mlx90614.h
 create mode 100644 packages/mlx90614.yaml
 create mode 100644 packages/scd40.yaml

diff --git a/growbox.yaml b/growbox.yaml
index 91bd394..a9a9c58 100644
--- a/growbox.yaml
+++ b/growbox.yaml
@@ -8,3 +8,5 @@ packages:
   time:       !include packages/time.yaml
   bme280:     !include packages/bme280.yaml
   yieryi2178: !include packages/yieryi3178.yaml
+  scd40:      !include packages/scd40.yaml
+  mlx90614:   !include packages/mlx90614.yaml
diff --git a/include/mlx90614.h b/include/mlx90614.h
new file mode 100644
index 0000000..a1467dc
--- /dev/null
+++ b/include/mlx90614.h
@@ -0,0 +1,28 @@
+#include "esphome.h"
+#include "Adafruit_MLX90614.h"
+
+class MLX90614 : public PollingComponent {
+  public:
+
+    Adafruit_MLX90614 mlx90614 = Adafruit_MLX90614();
+    Sensor *ambient_temperature = new Sensor();
+    Sensor *object_temperature = new Sensor();
+
+    MLX90614( uint32_t update_interval ) : PollingComponent(update_interval) {} 
+
+    void setup() override {
+      mlx90614.begin();
+    }
+
+    void update() override {
+      float amb_temperature = 0.0;
+      amb_temperature = mlx90614.readAmbientTempC(); // reading twice seemed to eliminate intermittent invalid data reads (shows as 1037.5 C)
+      amb_temperature = mlx90614.readAmbientTempC(); 
+      ambient_temperature->publish_state(amb_temperature);
+
+      float obj_temperature = 0.0;
+      obj_temperature = mlx90614.readObjectTempC(); // only had invalid reads for ambient teperature but taking two readings of object temperature as well fwiw
+      obj_temperature = mlx90614.readObjectTempC();
+      object_temperature->publish_state(obj_temperature);
+    }
+};
diff --git a/packages/mlx90614.yaml b/packages/mlx90614.yaml
new file mode 100644
index 0000000..513e486
--- /dev/null
+++ b/packages/mlx90614.yaml
@@ -0,0 +1,34 @@
+esphome:
+  includes:
+    - include/mlx90614.h
+  libraries:
+    - Wire
+    - SPI
+    - https://github.com/adafruit/Adafruit_BusIO @ 1.13.2
+    - https://github.com/adafruit/Adafruit-MLX90614-Library @ 2.1.3
+
+sensor:
+- platform: custom 
+  lambda: |-
+    auto mlx90614 = new MLX90614(5000);   
+    App.register_component(mlx90614);
+    return {mlx90614->ambient_temperature, mlx90614->object_temperature};
+  sensors:
+  - id: mlx90614_temperature_ambient
+    name: "IR: Ambient Temperature"
+    unit_of_measurement: °C
+    accuracy_decimals: 2
+  - id: mlx90614_temperature_object
+    name: "IR: Object Temperature"
+    unit_of_measurement: °C
+    accuracy_decimals: 2
+
+
+prometheus:
+  relabel:
+    mlx90614_temperature_object:
+      id: temperature_ir
+      name: "Object Temperature (IR)"
+    mlx90614_temperature_ambient:
+      id: temperature_ir_ambient
+      name: "Ambient Temperature (IR)"
diff --git a/packages/scd40.yaml b/packages/scd40.yaml
new file mode 100644
index 0000000..f785abe
--- /dev/null
+++ b/packages/scd40.yaml
@@ -0,0 +1,22 @@
+sensor:
+- platform: scd4x
+  update_interval: 5s
+  ambient_pressure_compensation_source: bme280_pressure
+  co2:
+    id: scd40_co2
+    name: "CO2"
+  temperature:
+    id: scd40_temperature
+    name: "CO2: Temperature"
+  humidity:
+    id: scd40_humidity
+    name: "CO2: Humidity"
+
+prometheus:
+  relabel:
+    scd40_temperature:
+      id: temperature_co2
+      name: "Temperature (CO2)"
+    scd40_humidity:
+      id: humidity_co2
+      name: "Humidity (CO2)"
-- 
GitLab