aboutsummaryrefslogtreecommitdiff
path: root/firmware/main.py
diff options
context:
space:
mode:
Diffstat (limited to 'firmware/main.py')
-rw-r--r--firmware/main.py126
1 files changed, 126 insertions, 0 deletions
diff --git a/firmware/main.py b/firmware/main.py
new file mode 100644
index 0000000..37ce957
--- /dev/null
+++ b/firmware/main.py
@@ -0,0 +1,126 @@
+import settings
+
+import sys
+from machine import Pin, I2C, WDT
+import network
+import time
+import struct
+
+import mqtt_as
+mqtt_as.MQTT_base.DEBUG = True
+
+
+from bme680 import *
+
+from homie.constants import FALSE, TRUE, BOOLEAN, FLOAT, STRING
+from homie.device import HomieDevice
+from homie.node import HomieNode
+from homie.property import HomieNodeProperty
+
+from uasyncio import get_event_loop, sleep_ms
+
+class BME680(HomieNode):
+
+ def __init__(self, name="bme680", device=None):
+ super().__init__(id="bme680", name=name, type="sensor")
+ self.wdt = WDT()
+ self.device = device
+ self.i2c = I2C(scl=Pin(5), sda=Pin(4))
+ self.bme680 = BME680_I2C(i2c=self.i2c)
+ self.temperature = HomieNodeProperty(
+ id="temperature",
+ name="temperature",
+ unit="°C",
+ settable=False,
+ datatype=FLOAT,
+ default=0,
+ )
+ self.add_property(self.temperature)
+ self.humidity = HomieNodeProperty(
+ id="humidity",
+ name="humidity",
+ unit="%",
+ settable=False,
+ datatype=FLOAT,
+ default=0,
+ )
+ self.add_property(self.humidity)
+ self.pressure = HomieNodeProperty(
+ id="pressure",
+ name="pressure",
+ unit="Pa",
+ settable=False,
+ datatype=FLOAT,
+ default=0,
+ )
+ self.add_property(self.pressure)
+ self.gas = HomieNodeProperty(
+ id="voc",
+ name="voc",
+ unit="ohm",
+ settable=False,
+ datatype=FLOAT,
+ default=0,
+ )
+ self.add_property(self.gas)
+ self.uptime = HomieNodeProperty(
+ id="uptime",
+ name="uptime",
+ settable=False,
+ datatype=STRING,
+ default="PT0S"
+ )
+ self.add_property(self.uptime)
+ loop = get_event_loop()
+ loop.create_task(self.update_data())
+ self.led = Pin(0, Pin.OUT)
+ self.online_led = Pin(12, Pin.OUT)
+ self.online_led.off()
+ self.last_online = time.time()
+ self.start = time.time()
+
+ async def update_data(self):
+ while True:
+ if self.device.mqtt.isconnected():
+ self.last_online = time.time()
+ self.online_led.on()
+ self.led.value(0) # illuminate onboard LED
+ self.temperature.data = str(self.bme680.temperature)
+ self.humidity.data = str(self.bme680.humidity)
+ self.pressure.data = str(self.bme680.pressure)
+ self.gas.data = str(self.bme680.gas)
+ self.uptime.data = self.get_uptime()
+ self.led.value(1) # onboard LED off
+ for _ in range(15):
+ self.wdt.feed()
+ await sleep_ms(1000)
+ else:
+ self.online_led.off()
+ if time.time() - self.last_online < 60:
+ self.wdt.feed()
+ await sleep_ms(1000)
+
+ def get_uptime(self):
+ diff = int(time.time() - self.start)
+ out = "PT"
+ # hours
+ if diff // 3600:
+ out += str(diff // 3600) + "H"
+ diff %= 3600
+ # minutes
+ if diff // 60:
+ out += str(diff // 60) + "M"
+ diff %= 60
+ # seconds
+ out += str(diff) + "S"
+ return out
+
+def main():
+ # homie
+ print("homie main")
+ homie = HomieDevice(settings)
+ homie.add_node(BME680(device=homie))
+ homie.run_forever()
+
+if __name__ == "__main__":
+ main()