diff --git a/coffee_scale/management/commands/fetchcoffee.py b/coffee_scale/management/commands/fetchcoffee.py new file mode 100644 index 0000000..40095f0 --- /dev/null +++ b/coffee_scale/management/commands/fetchcoffee.py @@ -0,0 +1,74 @@ +from django.core.management.base import BaseCommand, CommandError +from django.utils import timezone +from django.conf import settings +from coffee_scale.models import Brewing + +import paho.mqtt.client as mqtt +import random + +brewing = False +lastbrew = timezone.now() +lastcups = 0 + + +def on_connect(client, userdata, flags, rc): + if rc != 0: + print("Failed to connect with result code: {}".format(rc)) + + print("Connected with result code: {}".format(rc)) + client.subscribe(settings.MQTT_SETTINGS.HOST.TOPICS.CUPS) + client.subscribe(settings.MQTT_SETTINGS.HOST.TOPICS.BREWING) + client.subscribe(settings.MQTT_SETTINGS.HOST.TOPICS.BREW_TIME) + + +def on_message(client, userdata, message): + print("%s %s".format(message.topic, message.payload.decode())) + + +def on_message_cups(client, userdata, message): + cups = int(message.payload.decode()) + print("cups: {}".format(cups)) + print("{}".format(timezone.now())) + + # checks if new coffee was brewed so we don't add the same brewing again to db + global lastcups # ;/ have to use global to store state instead of class + if cups > lastcups: + new_brew = Brewing(cups=cups, time=timezone.now()) + print(new_brew.time) + new_brew.save() + lastcups = cups + + +def on_message_brewtime(client, userdata, message): + brewtime = datetime.fromtimestamp(int(message.payload.decode())) + print("brewtime: {}".format(brewtime)) + + +def on_message_brewing(client, userdata, message): + brewing = bool(int(message.payload.decode())) + print("brewing: {}".format(brewing)) + + +class Command(BaseCommand): + help = "Fetches coffee mqtt messages" + + def add_arquments(self, parser): + pass + + def handle(self, *args, **options): + self.username = "coffee-user-%d".format(random.randint(0, 100)) + self.client = mqtt.Client("coffee") + self.client.username_pw_set(self.username, password=None) + self.client.tls_set() + + # callbacks for different topics + self.client.message_callback_add(settings.MQTT_SETTINGS.HOST.TOPICS.BREW_TIME, on_message_brewtime) + self.client.message_callback_add(settings.MQTT_SETTINGS.HOST.TOPICS.CUPS, on_message_cups) + self.client.message_callback_add(settings.MQTT_SETTINGS.HOST.TOPICS.BREWING, on_message_brewing) + + # self.client.connect("localhost", port=1883) # used for local testing + self.client.connect(settings.MQTT_SETTINGS.HOST, port=settings.MQTT_SETTINGS.PORT) + self.client.on_message = on_message + self.client.on_connect = on_connect + while True: + self.client.loop() diff --git a/coffee_scale/migrations/0001_initial.py b/coffee_scale/migrations/0001_initial.py new file mode 100644 index 0000000..f1643ec --- /dev/null +++ b/coffee_scale/migrations/0001_initial.py @@ -0,0 +1,24 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11 on 2017-11-19 10:55 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ] + + operations = [ + migrations.CreateModel( + name='Brewing', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('cups', models.PositiveSmallIntegerField()), + ('time', models.DateTimeField()), + ], + ), + ] diff --git a/coffee_scale/models.py b/coffee_scale/models.py index 71a8362..3e608b7 100644 --- a/coffee_scale/models.py +++ b/coffee_scale/models.py @@ -1,3 +1,6 @@ from django.db import models -# Create your models here. + +class Brewing(models.Model): + cups = models.PositiveSmallIntegerField() + time = models.DateTimeField() diff --git a/requirements.txt b/requirements.txt index 3db9b7a..45cb8e9 100644 --- a/requirements.txt +++ b/requirements.txt @@ -32,4 +32,5 @@ telepot==12.3 django-import-export==0.5.1 django-password-reset==1.0 pyexcel==0.5.6 -pyexcel-xlsx==0.5.2 \ No newline at end of file +pyexcel-xlsx==0.5.2 +paho-mqtt==1.3.1