From e991210ce6704d2097c6c2d94b88d819aa39176c Mon Sep 17 00:00:00 2001 From: MangaValk Date: Thu, 15 Oct 2026 22:29:12 +0200 Subject: [PATCH] Add pictures of all dynamic pages to the README tools/make_page_screenshots.py asks the ESP32 to draw every page (with the current Home Assistant values) and writes them as PNG in the style of the web UI's live view to Pictures/pages/. Co-Authored-By: Claude Opus 5.5 --- Pictures/pages/3d-printer.png | Bin 0 -> 4087 bytes Pictures/pages/aftellen.png | Bin 0 -> 3745 bytes Pictures/pages/binnen.png | Bin 0 -> 4310 bytes Pictures/pages/clock-0000.png | Bin 0 -> 3992 bytes Pictures/pages/clock-1700.png | Bin 0 -> 4091 bytes Pictures/pages/dag-en-nacht-0700.png | Bin 0 -> 4206 bytes Pictures/pages/dag-en-nacht-1900.png | Bin 0 -> 4085 bytes Pictures/pages/datum.png | Bin 0 -> 3967 bytes Pictures/pages/energie.png | Bin 0 -> 4019 bytes Pictures/pages/grote-klok-0700.png | Bin 0 -> 3935 bytes Pictures/pages/grote-klok-2200.png | Bin 0 -> 3702 bytes Pictures/pages/stopwatch.png | Bin 0 -> 3429 bytes Pictures/pages/verbruik.png | Bin 0 -> 4247 bytes Pictures/pages/weer.png | Bin 0 -> 4162 bytes README.md | 21 +++++ tools/make_page_screenshots.py | 114 +++++++++++++++++++++++++++ 16 files changed, 135 insertions(+) create mode 100644 Pictures/pages/3d-printer.png create mode 100644 Pictures/pages/aftellen.png create mode 100644 Pictures/pages/binnen.png create mode 100644 Pictures/pages/clock-0000.png create mode 100644 Pictures/pages/clock-1700.png create mode 100644 Pictures/pages/dag-en-nacht-0700.png create mode 100644 Pictures/pages/dag-en-nacht-1900.png create mode 100644 Pictures/pages/datum.png create mode 100644 Pictures/pages/energie.png create mode 100644 Pictures/pages/grote-klok-0700.png create mode 100644 Pictures/pages/grote-klok-2200.png create mode 100644 Pictures/pages/stopwatch.png create mode 100644 Pictures/pages/verbruik.png create mode 100644 Pictures/pages/weer.png create mode 100644 tools/make_page_screenshots.py diff --git a/Pictures/pages/3d-printer.png b/Pictures/pages/3d-printer.png new file mode 100644 index 0000000000000000000000000000000000000000..c08d44a19c18bb2227239e4a851ea44953c444aa GIT binary patch literal 4087 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 literal 0 HcmV?d00001 diff --git a/Pictures/pages/aftellen.png b/Pictures/pages/aftellen.png new file mode 100644 index 0000000000000000000000000000000000000000..4105f25c28cd8e92931b3a08ac8caccd684bc97c GIT binary patch literal 3745 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 M_Re-3+ix%Y6OZRMm;e9( literal 0 HcmV?d00001 diff --git a/Pictures/pages/binnen.png b/Pictures/pages/binnen.png new file mode 100644 index 0000000000000000000000000000000000000000..dd7cbcafad21d7cc634f141698cdd5b5487020b1 GIT binary patch literal 4310 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 literal 0 HcmV?d00001 diff --git a/Pictures/pages/clock-0000.png b/Pictures/pages/clock-0000.png new file mode 100644 index 0000000000000000000000000000000000000000..28ad2fcf2d162062e9fd374de0fce4d3750db5ad GIT binary patch literal 3992 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 BdSUDdXBO?)0 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 literal 0 HcmV?d00001 diff --git a/Pictures/pages/datum.png b/Pictures/pages/datum.png new file mode 100644 index 0000000000000000000000000000000000000000..27c76e42acd50be22eb5754e7bc95da2d7e8b0ae GIT binary patch literal 3967 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 LdlNH6ymRP3&xCpy literal 0 HcmV?d00001 diff --git a/Pictures/pages/verbruik.png b/Pictures/pages/verbruik.png new file mode 100644 index 0000000000000000000000000000000000000000..d0508e464087830fb5bfa2846e846d1ed31b669b GIT binary patch literal 4247 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 literal 0 HcmV?d00001 diff --git a/Pictures/pages/weer.png b/Pictures/pages/weer.png new file mode 100644 index 0000000000000000000000000000000000000000..f9cc07db50bef1c0cb1adde68e7dbc923795fe2d GIT binary patch literal 4162 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 KdsMlHUHLC5YvG9i literal 0 HcmV?d00001 diff --git a/README.md b/README.md index 48651ca..6ab54be 100644 --- a/README.md +++ b/README.md @@ -122,6 +122,27 @@ when the shown text changes, so round values with the decimals setting. Settings are stored in the ESP32's NVS. The defaults are the original behaviour. There is no login: anyone on your WiFi can use the page, as with OTA. +## Pages + +The dynamic pages on the display, drawn by the ESP32 itself (`python +tools/make_page_screenshots.py` makes these pictures again). The Clock page is built in; +the others are the example pages in [examples/home-pages.json](examples/home-pages.json) +(import them in the web UI, System tab; they use this home's Home Assistant entities). + +| Page | | +|---|---| +| **Clock** (built in), day and from 17:00 | ![Clock](Pictures/pages/clock-0000.png) ![Clock, evening](Pictures/pages/clock-1700.png) | +| **Weer**: clock, weather icon by state, humidity, temperature | ![Weer](Pictures/pages/weer.png) | +| **Dag en nacht**: sun from 07:00, moon and stars from 19:00, date | ![Dag en nacht, day](Pictures/pages/dag-en-nacht-0700.png) ![Dag en nacht, night](Pictures/pages/dag-en-nacht-1900.png) | +| **Energie**: net power now, solar today, clock | ![Energie](Pictures/pages/energie.png) | +| **3D printer**: progress, time left, status message (scrolls), nozzle temperature | ![3D printer](Pictures/pages/3d-printer.png) | +| **Binnen**: room and outside temperature, CO2, air quality | ![Binnen](Pictures/pages/binnen.png) | +| **Verbruik**: water and energy used today, solar today | ![Verbruik](Pictures/pages/verbruik.png) | +| **Grote klok**: big clock, inverted from 22:00 | ![Grote klok](Pictures/pages/grote-klok-0700.png) ![Grote klok, night](Pictures/pages/grote-klok-2200.png) | +| **Datum**: weekday and date | ![Datum](Pictures/pages/datum.png) | +| **Aftellen**: countdown to Christmas | ![Aftellen](Pictures/pages/aftellen.png) | +| **Stopwatch** | ![Stopwatch](Pictures/pages/stopwatch.png) | + ## Flashing the Nano over WiFi The ESP32 can flash the Nano for you, so you don't need a USB cable at the display: diff --git a/tools/make_page_screenshots.py b/tools/make_page_screenshots.py new file mode 100644 index 0000000..d188f59 --- /dev/null +++ b/tools/make_page_screenshots.py @@ -0,0 +1,114 @@ +"""Saves a picture of every dynamic page in Pictures/pages/, drawn by the ESP32 itself. + + python tools/make_page_screenshots.py [ESP32 address, default 10.1.1.198] + +The ESP32 draws each page (/api/pages/preview) with the current date and Home Assistant +values; pages whose background changes with the time of day get a picture per time slot. +The pictures look like the live view in the web UI: yellow and dark dots. Only the Python +standard library is used (the PNG files are written by hand). +""" + +import json +import os +import re +import struct +import sys +import urllib.request +import zlib + +ESP = 'http://' + (sys.argv[1] if len(sys.argv) > 1 else '10.1.1.198') +OUT = os.path.join(os.path.dirname(os.path.dirname(os.path.abspath(__file__))), 'Pictures', 'pages') +W, H = 84, 19 +CELL = 10 # pixels per dot +BORDER = 10 +DOT = 0.42 # dot radius, part of a cell +ON, OFF, BG = (0xFF, 0xD2, 0x1F), (0x2C, 0x2F, 0x36), (0, 0, 0) +TIME = '12:34' # the time pages without time slots are drawn for + + +def call(path, body=None): + data = None if body is None else json.dumps(body).encode() + req = urllib.request.Request(ESP + path, data=data, headers={'Content-Type': 'application/json'}) + with urllib.request.urlopen(req, timeout=20) as r: + return json.loads(r.read()) + + +def dots(hexdata): + return [[int(hexdata[(y * 11 + x // 8) * 2:(y * 11 + x // 8) * 2 + 2], 16) >> (7 - x % 8) & 1 for x in range(W)] + for y in range(H)] + + +def png(path, image): + width, height = W * CELL + 2 * BORDER, H * CELL + 2 * BORDER + # One dot, 4x4 supersampled for smooth edges: coverage per pixel of a cell + sub = 4 + cover = [] + for py in range(CELL): + row = [] + for px in range(CELL): + inside = 0 + for sy in range(sub): + for sx in range(sub): + dx = px + (sx + 0.5) / sub - CELL / 2 + dy = py + (sy + 0.5) / sub - CELL / 2 + inside += dx * dx + dy * dy <= (DOT * CELL) ** 2 + row.append(inside / (sub * sub)) + cover.append(row) + + def mix(color, a): + return bytes(round(BG[i] + (color[i] - BG[i]) * a) for i in range(3)) + + rows = [] + blank = mix(BG, 0) * width + for y in range(height): + gy = y - BORDER + if gy < 0 or gy >= H * CELL: + rows.append(b'\0' + blank) + continue + line = bytearray(mix(BG, 0) * BORDER) + for gx in range(W * CELL): + line += mix(ON if image[gy // CELL][gx // CELL] else OFF, cover[gy % CELL][gx % CELL]) + line += mix(BG, 0) * BORDER + rows.append(b'\0' + bytes(line)) + + def chunk(kind, data): + return struct.pack('>I', len(data)) + kind + data + struct.pack('>I', zlib.crc32(kind + data) & 0xFFFFFFFF) + + with open(path, 'wb') as f: + f.write(b'\x89PNG\r\n\x1a\n') + f.write(chunk(b'IHDR', struct.pack('>IIBBBBB', width, height, 8, 2, 0, 0, 0))) + f.write(chunk(b'IDAT', zlib.compress(b''.join(rows), 9))) + f.write(chunk(b'IEND', b'')) + + +def file_name(name, time=None): + base = re.sub(r'[^a-z0-9]+', '-', name.lower()).strip('-') + return base + ('-' + time.replace(':', '') if time else '') + '.png' + + +def main(): + os.makedirs(OUT, exist_ok=True) + for p in call('/api/pages')['pages']: + page = p['page'] + # The entities the page shows: read them now, so the picture has real values + for e in page['elements']: + if e.get('entity'): + query = urllib.parse.urlencode({'entity': e['entity'], 'attribute': e.get('attribute', '')}) + try: + call('/api/ha/value?' + query) + except Exception: + pass + starts = [s['start'] for s in page['slots']] + times = [None] if len(starts) < 2 else starts + for t in times: + # A slot from 00:00 is drawn at TIME; other slots a little after they start + when = TIME if t is None else (TIME if t == '00:00' else '%s:%02d' % (t[:2], int(t[3:]) + 30)) + r = call('/api/pages/preview', {'page': page, 'time': when}) + name = file_name(p['name'], None if t is None else t) + png(os.path.join(OUT, name), dots(r['data'])) + print(name) + + +if __name__ == '__main__': + import urllib.parse + main()