diff --git a/coffee_scale/__init__.py b/coffee_scale/__init__.py new file mode 100644 index 0000000..c2eaae7 --- /dev/null +++ b/coffee_scale/__init__.py @@ -0,0 +1,3 @@ +from . import mqtt + +mqtt.client.loop_start() diff --git a/coffee_scale/admin.py b/coffee_scale/admin.py new file mode 100644 index 0000000..8c38f3f --- /dev/null +++ b/coffee_scale/admin.py @@ -0,0 +1,3 @@ +from django.contrib import admin + +# Register your models here. diff --git a/coffee_scale/apps.py b/coffee_scale/apps.py new file mode 100644 index 0000000..7785abc --- /dev/null +++ b/coffee_scale/apps.py @@ -0,0 +1,5 @@ +from django.apps import AppConfig + + +class CoffeeScaleConfig(AppConfig): + name = 'coffee_scale' diff --git a/coffee_scale/migrations/__init__.py b/coffee_scale/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/coffee_scale/models.py b/coffee_scale/models.py new file mode 100644 index 0000000..71a8362 --- /dev/null +++ b/coffee_scale/models.py @@ -0,0 +1,3 @@ +from django.db import models + +# Create your models here. diff --git a/coffee_scale/mqtt.py b/coffee_scale/mqtt.py new file mode 100644 index 0000000..01a1c1d --- /dev/null +++ b/coffee_scale/mqtt.py @@ -0,0 +1,65 @@ +import paho.mqtt.client as mqtt +import logging +import datetime +from collections import deque + +TOPIC_TEMP = "sik/kiltahuone/kahvivaaka/temperature" +TOPIC_WEIGHT = "sik/kiltahuone/kahvivaaka/weight" + +BREWING_DIFFERENTIAL = 60 +# setting down the pan creates at least 800 g of weight +BREWING_DIFFERENTIAL_ERROR_MAX = 800 +WEIGHT_DEQUE_LENGTH = 20 +weight_deque = deque(maxlen=WEIGHT_DEQUE_LENGTH) +latest = { + 'last_brew': datetime.datetime.now() +} + + +def on_connect(client, userdata, flags, rc): + logging.info('Subscribing to all topics on mqtt.sik.party.') + client.subscribe("#") + + +def on_message(client, userdata, msg): + if msg.topic == TOPIC_TEMP: + latest['temp'] = float(msg.payload.decode('utf-8')) + elif msg.topic == TOPIC_WEIGHT: + weight = float(msg.payload.decode('utf-8')) + latest['weight'] = weight + weight_deque.appendleft(weight) + + +def on_disconnect(client, userdata, rc): + client.loop_stop(force=False) + if rc != 0: + print("Unexpected disconnection.") + else: + print("Disconnected") + + +def get_latest(): + if len(weight_deque) > 2: + first = weight_deque[0] + last = weight_deque[len(weight_deque) - 1] + diff = first - last # reverse order + + if len(weight_deque) < WEIGHT_DEQUE_LENGTH: + brewing = False + else: + if BREWING_DIFFERENTIAL < diff < BREWING_DIFFERENTIAL_ERROR_MAX: + brewing = True + latest['last_brew'] = datetime.datetime.now() + else: + brewing = False + + latest['brewing'] = brewing + return latest + + +client = mqtt.Client() +client.on_connect = on_connect +client.on_message = on_message +client.on_disconnect = on_disconnect + +client.connect("mqtt.sik.party", 1883, 60) diff --git a/coffee_scale/static/img/coffeecup3.png b/coffee_scale/static/img/coffeecup3.png new file mode 100644 index 0000000..5170d5f Binary files /dev/null and b/coffee_scale/static/img/coffeecup3.png differ diff --git a/coffee_scale/static/img/smokes.png b/coffee_scale/static/img/smokes.png new file mode 100644 index 0000000..cb19720 Binary files /dev/null and b/coffee_scale/static/img/smokes.png differ diff --git a/coffee_scale/templates/coffee.html b/coffee_scale/templates/coffee.html new file mode 100644 index 0000000..f34d20d --- /dev/null +++ b/coffee_scale/templates/coffee.html @@ -0,0 +1,292 @@ + +
+