75 lines
2.5 KiB
Python
75 lines
2.5 KiB
Python
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()
|