Ещё в 2015 году Бен Наттолл придумал gpiozero — Python-библиотеку для Raspberry Pi, которая прячет от разработчика пины, напряжения и фронты сигнала, позволяя оперировать кнопками, светодиодами и моторами. Библиотека предлагала три стиля: процедурный опрос while True: if button.is_pressed: led.on(), событийную привязку button.when_pressed = led.on и декларативный способ led.source = button. Последний — одна строчка, но если логику нужно инвертировать, проще исправить первые два. gpiozero двинулась дальше и позволила пропускать поток значений через функции: led.source = negated(button) или даже servo.source = sin_values(), чтобы сервопривод плавно качался.
Устройствам назначили стандартные диапазоны: кнопка даёт 0 или 1, светодиод зажигается единицей, а с PWM яркостью управляют значения от 0 до 1. Аналоговый вход MCP3008, читающий 0–1, можно напрямую скормить как источник PWMLED — яркость будет повторять потенциометр. Моторы принимают от -1 до 1: положительные числа — вперёд, отрицательные — назад, поэтому синусоида заставляет их разгоняться, останавливаться и реверсировать. Набор готовых трансформеров включает negated, inverted, clamped, scaled, absoluted, booleanized, zipped, smoothed, а при желании пишутся и свои генераторы.
Эту концепцию автор много раз показывал на конференциях, а в документации gpiozero изображал блок-схемами. Так родилась мысль сделать веб-интерфейс, где устройства перетаскивают на холст и соединяют линиями — прямой перенос идеи потоков source/values. Существующий Node-RED казался запутанным и завязанным на пины, а не на готовые устройства. В 2026 году, имея под рукой Claude, Наттолл быстро описал идею и получил рабочий прототип симулятора. Он докрутил интерфейс, добавил конфигурацию, иконки и анимации.
Затем добавили генератор Python-кода, чтобы видеть эквивалентный скрипт, и агента для удалённого управления живыми пинами Raspberry Pi. Веб-приложение связалось с платой через websockets, и всё заработало. Постепенно поддержали почти все устройства gpiozero, включая внутренний класс TimeOfDay, полный набор инструментов манипуляции потоками и искусственные источники наподобие sin_values. Платы расширения отображаются на холсте разобранными на компоненты, заранее настроенными на нужные пины. Составные устройства вроде светофора можно расщепить на отдельные LED, превращать LED в PWMLED и обратно, указывать параметры инициализации и открывать документацию к классу прямо из интерфейса. Добавили сохранение в localStorage, сжатое JSON-представление в base64 для шейринга ссылок, импорт и экспорт проектов.
Изначально удалённое управление работало на локальном хосте, но Claude предупредил: при размещении веб-приложения по HTTPS нельзя инициировать незащищённые websocket-соединения, а сертификат для локального устройства не получить. Решение подсказал друг Роби: Наттолл выпустил Python-пакет gpiozero-flow, который включает и веб-агента, и само веб-приложение. Установив пакет на Pi и запустив оба компонента, пользователь заходит на flow.bennuttall.com, вводит IP или хостнейм своего устройства — и проект переносится в локальный интерфейс с живым режимом прямого управления GPIO.
Сейчас проект доступен как эксперимент. Бен честно признаётся, что не уверен в его практической пользе, но сравнивает с Scratch, Blockly или Edublocks. Для сложной логики инструменту, вероятно, не хватает выразительности, однако как средство вычислительного мышления — особенно в темах систем и управления — он может пригодиться. В будущем автор рассматривает добавление событийной модели gpiozero, хотя это рискует сломать ментальную картину потоков значений. Прикручивать пользовательские функции-генераторы он пока не спешит, чтобы не превращать проект в ещё один процедурный конструктор.