From 5da4b52bde4f4d307877b49c7daa6f1672a43453 Mon Sep 17 00:00:00 2001 From: Jan Tuomi Date: Mon, 18 Sep 2017 23:16:19 +0300 Subject: [PATCH] Move coffee scale to web2.0 --- coffee_scale/__init__.py | 3 + coffee_scale/admin.py | 3 + coffee_scale/apps.py | 5 + coffee_scale/migrations/__init__.py | 0 coffee_scale/models.py | 3 + coffee_scale/mqtt.py | 65 ++++++ coffee_scale/static/img/coffeecup3.png | Bin 0 -> 16414 bytes coffee_scale/static/img/smokes.png | Bin 0 -> 9219 bytes coffee_scale/templates/coffee.html | 292 +++++++++++++++++++++++++ coffee_scale/tests.py | 3 + coffee_scale/urls.py | 14 ++ coffee_scale/views.py | 40 ++++ requirements.txt | 1 + sikweb/settings-sample.py | 1 + sikweb/urls.py | 2 + 15 files changed, 432 insertions(+) create mode 100644 coffee_scale/__init__.py create mode 100644 coffee_scale/admin.py create mode 100644 coffee_scale/apps.py create mode 100644 coffee_scale/migrations/__init__.py create mode 100644 coffee_scale/models.py create mode 100644 coffee_scale/mqtt.py create mode 100644 coffee_scale/static/img/coffeecup3.png create mode 100644 coffee_scale/static/img/smokes.png create mode 100644 coffee_scale/templates/coffee.html create mode 100644 coffee_scale/tests.py create mode 100644 coffee_scale/urls.py create mode 100644 coffee_scale/views.py 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 0000000000000000000000000000000000000000..5170d5f95d2f44f86686712daca2d3679f2f73fe GIT binary patch literal 16414 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 literal 0 HcmV?d00001 diff --git a/coffee_scale/static/img/smokes.png b/coffee_scale/static/img/smokes.png new file mode 100644 index 0000000000000000000000000000000000000000..cb19720ec46a7e90f745824617f398866441216f GIT binary patch literal 9219 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 lrX&h=zjG+wP;4z{hn!+8X-m#rN!<{y#&2wUqz> literal 0 HcmV?d00001 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 @@ + + +Coffee Cups @Guild Room - AYY SIK RY + + + + + + + + + + + + + + + +
+ + + Kahvivaaka + +
+ +
+
+ +
+
+
+
+
+ + diff --git a/coffee_scale/tests.py b/coffee_scale/tests.py new file mode 100644 index 0000000..7ce503c --- /dev/null +++ b/coffee_scale/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/coffee_scale/urls.py b/coffee_scale/urls.py new file mode 100644 index 0000000..b9c54e6 --- /dev/null +++ b/coffee_scale/urls.py @@ -0,0 +1,14 @@ +from django.conf.urls import url +from django.views.generic.base import RedirectView + +from .views import coffee_view, cups_view + +favicon_view = RedirectView.as_view(url='static/img/favicon.ico', permanent=True) + +urlpatterns = [ + + # landing page + url(r'^$', coffee_view), + url(r'^cups', cups_view), + +] diff --git a/coffee_scale/views.py b/coffee_scale/views.py new file mode 100644 index 0000000..affdd00 --- /dev/null +++ b/coffee_scale/views.py @@ -0,0 +1,40 @@ +from django.shortcuts import render +from django.http import JsonResponse + +import datetime +from .mqtt import get_latest + + +def get_cups_from_weight(weight): + if not weight: + return 0 + + EMPTY = 820 # grams + FULL = 2000 # grams + cups = 10 * (weight - EMPTY) / (FULL - EMPTY) + + cups = round(cups, 1) + if cups < 0: + cups = 0 + if cups > 10: + cups = 10 + + return cups + + +def coffee_view(request): + return render(request, 'coffee.html') + + +def cups_view(request): + now = datetime.datetime.now() + latest = get_latest() + cups = get_cups_from_weight(latest.get('weight')) + data = { + 'date': now, + 'cups': cups, + 'temp': latest.get('temp'), + 'last_brew': latest.get('last_brew'), + 'brewing': latest.get('brewing') + } + return JsonResponse(data) diff --git a/requirements.txt b/requirements.txt index ab2442a..3c028d5 100644 --- a/requirements.txt +++ b/requirements.txt @@ -25,3 +25,4 @@ dealer==2.0.5 django-modeltranslation==0.12.1 django-auditlog==0.4.3 django-phonenumber-field==1.3.0 +paho-mqtt==1.3.0 diff --git a/sikweb/settings-sample.py b/sikweb/settings-sample.py index 4de7034..1faf433 100644 --- a/sikweb/settings-sample.py +++ b/sikweb/settings-sample.py @@ -50,6 +50,7 @@ INSTALLED_APPS = [ 'webapp', 'members', 'infoscreen', + 'coffee_scale', 'rest_framework', 'django_nose', 'bootstrap3', diff --git a/sikweb/urls.py b/sikweb/urls.py index 924c5b4..0113b57 100644 --- a/sikweb/urls.py +++ b/sikweb/urls.py @@ -25,11 +25,13 @@ from django.contrib.staticfiles import views as static_views import webapp.urls import infoscreen.urls import members.urls +import coffee_scale.urls urlpatterns = [ url(r'', include('webapp.urls')), url(r'^members/', include('members.urls')), url(r'^infoscreen/', include('infoscreen.urls')), + url(r'^coffee/', include('coffee_scale.urls')), # admin url(r'^admin/', admin.site.urls),