diff --git a/growbox.yaml b/growbox.yaml
index 91bd3947770c10072f267a6c165a72da99fa82ed..a9a9c589aa48dfba2556ced6287be86274dd45c6 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 0000000000000000000000000000000000000000..a1467dc11f5912c2da1342f3ebfb521122bebd46
--- /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 0000000000000000000000000000000000000000..513e486244f1aee9c2cbc0902617e91118880c81
--- /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 0000000000000000000000000000000000000000..f785abeb5ef2ef988d9e2c5902189db3d395b460
--- /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)"