Gpiozero Flow
摘要
这篇文章重新审视了gpiozero库中用于声明式连接GPIO设备的source/values抽象,并提出一种拖放式Web界面,让用户以可视化方式将设备连接起来,该设计基于库的面向流程的设计。
暂无内容
查看缓存全文
缓存时间: 2026/07/30 10:48
# gpiozero flow
来源: https://bennuttall.com/blog/2026/07/gpiozero-flow/
早在2015年,我就有了`gpiozero`(https://gpiozero.readthedocs.io/en/stable/)的想法——一个面向树莓派的Python库,通过抽象化让GPIO设备编程变得更简单:我们不再需要关注引脚通道、电压、上拉电阻或上升/下降沿,而是考虑按钮被按下或松开、传感器检测到光线或运动、电机向前或向后驱动。`gpiozero`让你能够以这些术语编写代码。
我们开发了一套以设备为中心的API,并形成了一些模式。最终我们支持了三种编程方式:
**过程式:**
``
while True:
if button.is_pressed:
led.on()
else:
led.off()
``
**事件驱动式:**
``
button.when_pressed = led.on
button.when_released = led.off
``
**声明式:**
``
led.source = button
``
这三个代码片段以不同方式实现了相同的功能。一个是反复**询问按钮**是否被按下;一个是**告诉按钮**去控制LED;另一个则是**告诉LED**去跟随按钮的状态。
很难说哪一种更易于阅读、编写或理解。也许最后一种更简单,因为它只有一行代码。但如果你想反转逻辑,让按钮熄灭LED而不是点亮,前两种很容易知道如何修改,而第三种则不那么直观。
但有趣的地方就在这里!我们提供了**函数**(https://gpiozero.readthedocs.io/en/stable/api_tools.html)用于在值流从一个设备传递到另一个设备时对其进行操作:
``
led.source = negated(button)
``
甚至可以提供像正弦波这样的人工值流:
``
servo.source = sin_values()
``
这将使舵机在其最小和最大位置之间稳定地来回转动。
这一切的工作原理是`gpiozero`为设备分配标准值范围。有些是简单的布尔值,比如按钮和LED。按钮按下时为1,否则为0。对于LED,0表示关闭,1表示打开。我们可以使用PWM来控制LED,使其亮度可以在0到1的范围内设置。如果我们读取一个0到1的模拟输入,我们可以直接用该设备控制LED的亮度:
``
pot = MCP3008()
led = PWMLED(pin)
led.source = pot
``
有些设备的值范围是-1到1,比如电机,其中0到1部分代表正向速度,0到-1部分代表反向速度。因此,正弦波会让它逐渐加速到全速,然后减速,反转方向,再反向加速到全速。
你可能想要操作或组合值流——因此我们提供了一系列常用函数,如`negated`、`inverted`、`clamped`、`scaled`、`absoluted`、`booleanized`、`zipped`和`smoothed`。你也可以编写自己的生成器函数。
在Raspberry Pi工作期间,我经常在会议上演讲时提到这个概念,并编写了一篇**文档页面**(https://gpiozero.readthedocs.io/en/stable/source_values.html)来解释它。该页面展示了设备之间的关系如何通过简单的流程图来表示:
[](https://gpiozero.readthedocs.io/en/stable/source_values.html)[](https://gpiozero.readthedocs.io/en/stable/source_values.html)
这引出了一个想法——一个基于Web的UI,你可以从侧面板拖拽GPIO设备到一个自由形式的画布上,并在它们之间画线进行连接。如果你将一个LED连接到一个按钮,那么按钮将会控制LED,完全基于source/values。
有一个叫Node-RED的项目就是这样工作的,但我发现它很复杂,而且它的GPIO功能是基于引脚的,而不是以设备为中心的。我心目中的设计完全基于gpiozero的source/values工作原理。
我知道我想要什么,但需要处理的复杂性太多,而且需要大量现代JavaScript的知识。所以到了2026年,我有了Claude来帮忙处理这类事情。
我写了一个描述和MVP的规格说明——纯粹是一个模拟器——在商定了一些技术和设计选择后,很快拥有了一个可工作的原型。我花了一些时间调整UI、添加配置、图标和动画。它很快就变成了一个有趣的工具,可以随意摆弄:
我们添加了一个Python代码生成器,这样你可以看到项目对应的Python代码。随后我们研究了远程控制树莓派GPIO引脚的方法,并编写了一个在树莓派上运行的代理。Web应用通过WebSocket与树莓派通信,而且**它完美地工作了**。
我们添加并完善了更多功能——支持gpiozero中的几乎所有设备,包括像`TimeOfDay`这样的内部设备,用于操作值流的各种source工具,以及像`sin_values`这样的人工源:
我想支持扩展板,但这不太符合source/values的设计,因为由输入和输出组件组成的复合设备形状使其难以使用。然而,能够拖入你拥有的一个扩展板,而不必分配它使用的所有特定引脚号,这很实用——因此我将扩展板包含在内,但让它们作为单独的组件出现在画布上,并预先配置在正确的引脚上。
我认为能够将像交通灯这样的复合设备分解为组件部件,并将`LED`转换为`PWMLED`或反向转换会很有用——所以我们添加了这些功能。我们添加了一组有限的初始化参数,并为每个类或函数添加了指向gpiozero文档的链接。我还希望能够保存多个画布——所以我们添加了localStorage支持。然后我们构建了压缩的JSON Base64编码,以便创建可共享的链接,以及以不同方式导入和导出。
虽然远程GPIO在我的本地主机上可以工作,但Claude确实指出,如果托管在HTTPS上,我们会遇到问题——因为你无法从HTTPS源发起不安全的WebSocket连接,也无法使用安全的WebSocket,因为你无法为局域网内的设备获取证书。
最初,我们将Web应用打包成一个简单的下载包,并提供了在本地运行应用的说明,但我朋友Robie的一个建议最终简化了过程。我发布了一个名为`gpiozero-flow`(https://pypi.org/project/gpiozero-flow/)的Python包,其中包含了WebSocket代理和Web应用本身。在树莓派上安装此包,并同时运行Web应用和代理,托管在`flow.bennuttall.com`(https://flow.bennuttall.com/)的应用可以让你连接到树莓派自己的应用实例——只需输入其IP或主机名,你的项目就会通过共享链接跟随你。从那里你可以切换到实时模式,直接控制你的GPIO引脚。
就这样,项目的初始版本上线了。试试看,看看你的想法如何!
[](https://flow.bennuttall.com/)
我不确定谁会觉得它有用。它还是实验性的,我只是**必须**尝试实现我的想法。在某种程度上,它是一个简单的图形化编程工具,类似于Scratch、Blockly或Edublocks。但你可以争辩说,要做超出基础功能的事情需要更高级的逻辑。也许它更适合作为计算思维工具而不是编程工具——可能更适合**系统与控制**(https://www.bbc.co.uk/bitesize/articles/z6q7b7h#z78dfdm)而不是计算机科学。
我**可以**考虑添加对gpiozero事件驱动范式的支持,我认为这会很好地工作,但可能会打破对值在设备之间流动的心智模型。也有可能添加自定义函数用作生成器,但同样,我最终会是在添加一个过程式编程工具。
相似文章
Gooey:面向 Zig 的 GPU 加速 UI 框架
Gooey 是一个面向 Zig 的 GPU 加速 UI 框架,通过 Metal、Vulkan/Wayland 和 WebGPU/WASM 支持 macOS、Linux 和浏览器。它提供声明式 UI、动画、主题、无障碍和零外部依赖。
Flipper Zero Zig 模板
一个现代化的、可用于生产的模板,用于使用 Zig 编程语言开发 Flipper Zero 应用程序,提供了精简的构建系统,将 Zig 与 Flipper Zero SDK 集成。
FlowG v0.59.0 发布,支持深色模式
FlowG v0.59.0 发布,作为前端重新设计的一部分,新增深色模式支持,从 Tailwind CSS 迁移到 React MUI。
@geekbb: pi-workflow 是一个为 Pi 设计的工作流编排工具,让 Pi 能执行多步骤、可复用的工作流,而不是只有单轮对话。用自然语言就能触发,不用每次手写提示词。 四种工作流直接用: - deep-research 做深度研究 - dee…
pi-workflow 是一个为 Pi AI 助手设计的工作流编排工具,使其能够执行多步骤、可重复的工作流,包括深度研究、代码审查、规格检查和影响评估。它通过 JSON 阶段图定义工作流,支持多种执行模式。
can1357/oh-my-pi
Oh My Pi 是一个基于 Pi 构建的开源编码代理,提供集成的 IDE,支持 40 多个提供商,内置工具,以及在多种模型上的显著性能提升。