From dbe0f6d47ef94cd9020c3f65b316612f6a6de1c6 Mon Sep 17 00:00:00 2001 From: Kevin Midboe Date: Sun, 9 Jul 2023 22:36:07 +0200 Subject: [PATCH] More code examples for brew dispaly --- _posts/2023-05-01-brewpi-display.markdown | 179 ++++++++++++++++++++++ 1 file changed, 179 insertions(+) diff --git a/_posts/2023-05-01-brewpi-display.markdown b/_posts/2023-05-01-brewpi-display.markdown index 57c3c17..291a3cb 100644 --- a/_posts/2023-05-01-brewpi-display.markdown +++ b/_posts/2023-05-01-brewpi-display.markdown @@ -15,4 +15,183 @@ Continuing on brewpi refrigerator project we have already created a [regulator]( fullwidth="true" %} +The code is split into the e-ink renderer and a http server to easier update. +server: + +```python +from flask import Flask, request, render_template, send_file, redirect, send_from_directory + +from main import draw + +app = Flask(__name__) + +brew = { + 'name': 'Kinn Kveldsbris', + 'time': '11 days', + 'phase': 'Carbonating', + 'next-phase': 'Drink' +} + +@app.route('/api/render', methods=['POST']) +def render(): + draw(brew) + + if request.headers.get('Content-Type') == 'application/json': + return 'ok' + else: + return redirect('/') + +@app.route('/_health') +def health(): + return 'ok' + +@app.route('/', methods=['GET']) +def index(): + return render_template('index.html', brew=brew) + +@app.route('/', methods=['POST']) +def indexForm(): + brew['name'] = request.form['name'] or brew['name'] + brew['time'] = request.form['time'] or brew['time'] + brew['phase'] = request.form['phase'] or brew['phase'] + brew['next-phase'] = request.form['next-phase'] or brew['next-phase'] + + return redirect('/') + +if __name__ == '__main__': + app.run(host='0.0.0.0') +``` + + + + +template/index.html: + +```html + + + + + Dynamic Label and Input Fields + + +

Name: {{ brew['name'] }}

+
Time: {{ brew['time'] }}
+
Phase: {{ brew['phase'] }}
+
Next phase: {{ brew['next-phase'] }}
+ +
+ +

+ + +

+ + +

+ + +

+ + +
+ +
+ +
+ + +``` + +renderer: + +```python +#!/usr/bin/python +# -*- coding:utf-8 -*- +import sys +import os +picdir = os.path.join(os.path.dirname(os.path.dirname(os.path.realpath(__file__))), 'brewDisplay/pic') +libdir = os.path.join(os.path.dirname(os.path.dirname(os.path.realpath(__file__))), 'brewDisplay/lib') +print(libdir) +if os.path.exists(libdir): + sys.path.append(libdir) + +import logging +from waveshare_epd import epd2in9bc +import time +from PIL import Image,ImageDraw,ImageFont +import traceback + +logging.basicConfig(level=logging.DEBUG) + +placeholderBrew = { + 'name': 'Kinn Kveldsbris', + 'time': '11 days', + 'phase': 'Carbonating', + 'next-phase': 'Drink' +} + +def draw(brew=placeholderBrew): + try: + logging.info("epd2in9bc Demo") + + epd = epd2in9bc.EPD() + logging.info("init and Clear") + epd.init() + epd.Clear() + + # Drawing on the image + logging.info("Drawing") + font70 = ImageFont.truetype(os.path.join(picdir, 'Font.ttc'), 70) + font40 = ImageFont.truetype(os.path.join(picdir, 'Font.ttc'), 40) + font24 = ImageFont.truetype(os.path.join(picdir, 'Font.ttc'), 24) + font20 = ImageFont.truetype(os.path.join(picdir, 'Font.ttc'), 20) + font18 = ImageFont.truetype(os.path.join(picdir, 'Font.ttc'), 18) + font16 = ImageFont.truetype(os.path.join(picdir, 'Font.ttc'), 16) + font14 = ImageFont.truetype(os.path.join(picdir, 'Font.ttc'), 14) + font12 = ImageFont.truetype(os.path.join(picdir, 'Font.ttc'), 12) + font8 = ImageFont.truetype(os.path.join(picdir, 'Font.ttc'), 8) + + # Drawing on the Horizontal image + logging.info("1.Drawing on the Horizontal image...") + HBlackimage = Image.new('1', (epd.height, epd.width), 255) # 298*126 + HRYimage = Image.new('1', (epd.height, epd.width), 255) # 298*126 ryimage: red or yellow image + drawblack = ImageDraw.Draw(HBlackimage) + drawry = ImageDraw.Draw(HRYimage) + # drawblack.text((2, 0), 'Schleppe brew', font = font12, fill = 0) + drawblack.text((2, 0), 'Beer: {}'.format(brew['name']), font = font14, fill = 0) + drawblack.text((2, 16), "State: heating", font = font20, fill = 0) + + drawblack.text((190, 0), "Time left", font = font18, fill = 0) + drawblack.text((190, 18), brew['time'], font = font12, fill = 0) + + drawblack.text((190, 34), "Phase", font = font18, fill = 0) + drawblack.text((190, 52), brew['phase'], font = font12, fill = 0) + drawblack.text((190, 66), "Next: {}".format(brew['next-phase']), font = font8, fill = 0) + + # ddrawblack.text((175, 54), "Time:", font = font16, fill = 0) + # ddrawblack.text((175, 66), "11 days", font = font12, fill = 0) + + drawblack.text((2, 55), "Inside temp", font = font14, fill = 0) + drawblack.text((2, 60), "4.3 C", font = font70, fill = 0) + drawblack.arc((110, 70, 120, 80), 0, 360, fill = 0) + + drawblack.text((175, 79), "Outside temp", font = font14, fill = 0) + drawblack.text((175, 89), "20.3 C", font = font40, fill = 0) + epd.display(epd.getbuffer(HBlackimage), epd.getbuffer(HRYimage)) + + logging.info("Goto Sleep...") + epd.sleep() + + except IOError as e: + logging.info(e) + + except KeyboardInterrupt: + logging.info("ctrl + c:") + epd2in9bc.epdconfig.module_exit() + exit() + +if __name__ == '__main__': + draw() +```