---
layout: post
title: E-ink brewpi viewer
date: 2023-05-01 10:46:15 +0200
updated: 2023-05-01 14:52:00 +0200
tags: brewing e-ink
---
Continuing on brewpi refrigerator project we have already created a [regulator]() & [website](), but I also want a way to view the current refrigerator state at a glance.
{% include image.html
src="0001-brewpi.jpeg"
alt="Jekyll's logo"
caption="E-ink display displaying current brew status."
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()
```