1. 项目缘起为什么要在工业终端上做天气看板最近在折腾一个工业物联网项目需要在一块Seeed Studio的reTerminal上部署一个实时监控面板。reTerminal这块板子挺有意思它本质上是一个基于树莓派CM4计算模块的工业级边缘设备自带一块5英寸的触摸屏运行着完整的Linux系统。在项目调试阶段我经常需要盯着各种传感器数据和系统状态Grafana自然成了首选的可视化工具。有一天盯着满屏的曲线图突然冒出一个想法这块屏幕大部分时间都亮着除了显示项目数据能不能让它发挥点“余热”比如变成一个颜值在线、信息丰富的桌面天气站这个想法并非空穴来风。首先reTerminal的定位就是工业边缘HMI人机界面其5寸屏的显示效果和触摸交互完全能胜任一个信息展示终端。其次它常开、联网、且有足够的计算能力运行Grafana这样的服务。最后也是最重要的一点通过构建一个天气仪表盘我能深入实践从数据采集调用天气API、到数据转换使用Grafana插件或自定义数据源、再到前端可视化Grafana面板设计的完整链路这对于理解物联网数据流和Grafana的扩展能力是一次绝佳的练手机会。它不再是一个“玩具项目”而是一个贴合硬件特性、解决实际展示需求、且具备学习价值的实战案例。2. 硬件与软件栈选型为什么是reTerminal Grafana在决定动手之前我们需要理清整个方案的技术栈并理解每一个选择背后的原因。这不仅仅是工具的堆砌更是确保项目可行性与优雅性的关键。2.1 硬件核心Seeed Studio reTerminal深度解析reTerminal不是一块普通的开发板它的设计充满了工业应用的考量。选择它作为载体基于以下几个硬核优势集成化与可靠性reTerminal的核心是树莓派Compute Module 4 (CM4)。与传统的树莓派主板外设的组装方式不同CM4以模块化形式直接焊接在底板上集成了eMMC存储可选、千兆以太网、双频Wi-Fi 蓝牙5.0。这种设计极大地提高了连接稳定性和抗振动能力非常适合7x24小时运行的场景。我们的天气看板需要持续运行稳定性是第一位的。交互与显示其搭载的5英寸IPS电容触摸屏分辨率为720x1280竖屏默认。这个尺寸和分辨率对于信息展示来说非常合适足够清晰又不会因为太大而显得笨重。自带的触摸功能意味着我们不仅可以“看”还可以进行简单的交互比如切换城市、查看不同时间段的预报这为仪表盘的交互设计提供了物理基础。丰富的工业接口除了常见的USB、HDMIreTerminal还提供了用于工业控制的DIO数字输入输出、CAN总线接口以及一个可扩展的40针树莓派兼容GPIO接头。虽然天气项目用不上这些但这说明了它的“主业”能力。我们可以利用其GPIO连接一个物理按钮实现一键切换显示模式例如在项目监控面板和天气看板之间切换让项目更有趣。供电与外壳它支持Type-C供电并自带一个精心设计的塑料外壳开箱即用无需额外的组装和散热烦恼非常适合作为桌面摆件。实操心得一系统镜像选择reTerminal官方提供了多种预装系统的eMMC版本也支持自刷SD卡。对于这个项目我强烈推荐使用基于Debian的官方Raspberry Pi OS (Legacy) Lite版本然后手动安装桌面环境。原因在于Grafana服务通常在后台无头运行我们不需要完整的、资源消耗较大的桌面如完整版的Raspberry Pi OS with Desktop。一个极简的桌面环境如LXDE或XFCE甚至直接使用Kiosk模式全屏浏览器即可满足显示需求这样能将更多的系统资源留给Grafana和数据获取进程。2.2 软件核心Grafana的不可替代性为什么不用一个简单的Python脚本直接显示天气信息或者用一个网页选择Grafana是基于其作为专业可视化平台的强大能力数据源无关性Grafana的核心优势之一是支持多种数据源Prometheus, InfluxDB, MySQL, JSON API等。对于天气数据我们可以通过其内置的“JSON API”数据源插件或使用更灵活的“Infinity”插件直接调用免费的天气API如Open-Meteo, WeatherAPI获取JSON格式数据无需自建数据库。这极大地简化了架构。强大的面板生态系统Grafana拥有丰富的官方和社区面板插件。对于天气展示我们可以利用Stat状态显示当前温度、体感温度、湿度。Gauge仪表盘显示气压、紫外线指数。Time series时间序列展示未来24小时或7天的温度、降水概率变化曲线。Bar gauge条形仪表显示风向风速。Text文本显示天气状况描述如“晴间多云”。Dashboard list仪表盘列表如果未来扩展了其他监控仪表盘可以方便切换。灵活的布局与刷新Grafana的仪表盘编辑器允许我们以拖拽的方式自由布局所有面板完美适配reTerminal 720x1280的竖屏分辨率。我们可以设置一个全局的自动刷新频率如每10分钟让天气信息自动更新。轻量级部署Grafana本身是用Go编写的资源占用相对较低。在树莓派CM4通常为4GB内存上运行绰绰有余。通过Docker部署更是简单干净。避坑指南一Grafana安装路径在ARM架构的树莓派OS上最稳妥的安装方式是使用官方提供的APT仓库。避免使用apt-get install grafana安装可能存在的旧版本。正确的做法是添加Grafana的官方仓库这样可以确保获得最新的、兼容ARM的稳定版本并能方便地后续更新。# 安装所需的依赖包 sudo apt-get install -y software-properties-common wget # 导入Grafana的GPG密钥 sudo wget -q -O /usr/share/keyrings/grafana.key https://apt.grafana.com/gpg.key # 添加稳定版仓库 echo deb [signed-by/usr/share/keyrings/grafana.key] https://apt.grafana.com stable main | sudo tee -a /etc/apt/sources.list.d/grafana.list # 更新并安装 sudo apt-get update sudo apt-get install -y grafana # 启动服务并设置开机自启 sudo systemctl enable --now grafana-server安装后默认通过http://reTerminal的IP:3000访问初始账号密码为admin/admin。3. 数据管道构建从API到Grafana面板这是项目的核心逻辑部分。我们的目标是建立一个自动化的数据流水线定期从互联网获取天气数据并将其转换为Grafana能够识别并美化的格式。3.1 天气API的选择与比较免费、稳定、数据格式友好是选择的三大原则。以下是几个主流选项的对比API 名称免费额度数据特点请求格式主要考量Open-Meteo完全免费无限次基于开源天气模型提供丰富的气象要素JSON结构极其清晰GET https://api.open-meteo.com/v1/forecast?latitude52.52longitude13.41hourlytemperature_2m首选推荐。无需注册、无密钥、文档清晰、JSON结构完美适配Grafana JSON API。WeatherAPI每月100万次商业数据源提供当前天气、预报、历史、天文等功能全面GET http://api.weatherapi.com/v1/current.json?keyYOUR_KEYqLondon需要注册获取API Key免费额度足够数据更偏向民用综合预报。OpenWeatherMap每分钟60次每日100万次老牌服务数据全面社区资源多GET https://api.openweathermap.org/data/2.5/weather?qLondonappidYOUR_KEY需要注册其免费版的API响应格式嵌套较深在Grafana中解析稍显复杂。综合来看Open-Meteo因其零门槛、结构化和足够的准确性成为本项目的最佳选择。它提供了current_weather当前天气、hourly逐小时预报、daily每日预报等参数我们可以按需组合。3.2 使用Grafana Infinity插件作为数据桥梁Grafana原生的“JSON API”数据源功能较为基础对于嵌套复杂的JSON解析能力有限。社区开发的“Infinity”插件是一个强大的通用数据源插件支持JSON、CSV、XML、GraphQL等多种格式并提供了类似jq的JSON路径查询能力非常适合处理天气API的返回数据。安装Infinity插件 在Grafana界面点击侧边栏“配置”齿轮图标- “插件”搜索“Infinity”点击安装。或者通过命令行在reTerminal上安装sudo grafana-cli plugins install yesoreyeram-infinity-datasource sudo systemctl restart grafana-server配置Infinity数据源在Grafana中“配置” - “数据源” - “添加数据源”搜索并选择“Infinity”。给数据源命名如OpenMeteo。在“URL”字段中填入Open-Meteo的API请求地址。例如获取北京当前天气和逐小时预报https://api.open-meteo.com/v1/forecast?latitude39.9042longitude116.4074current_weathertruehourlytemperature_2m,relativehumidity_2m,precipitation_probabilitytimezoneAsia/Shanghai最关键的一步在“Parser”部分选择“Backend”。在“JSON”子选项卡下使用“UQL”Infinity的查询语言或“GROQ”来解析数据。例如要提取当前温度UQL查询可以写为SELECT weathercode, temperature, windspeed FROM current_weather这会将API返回的JSON对象中current_weather字段下的子字段映射为表格的列。点击“Save Test”如果配置正确会返回一个预览表格显示解析出的天气数据。实操心得二处理时间序列数据对于逐小时预报hourlyAPI返回的是两个数组time和对应的temperature_2m。我们需要将其转换为Grafana Time series面板能识别的格式。在Infinity中可以使用更高级的UQL或配置“数据格式”为“Time series”。一个更通用的技巧是在Infinity中先通过UQL的UNPIVOT或相关函数将time和temperature_2m数组合并为(时间 温度)的行数据。这个过程可能需要一些UQL语法摸索但一旦配置成功就能一劳永逸地获取动态更新的时间序列数据。3.3 备用方案使用轻量级数据中转服务如果觉得Infinity插件的配置学习曲线较陡或者API返回格式过于复杂难以直接解析可以采用一个经典的备用方案编写一个简单的Python脚本作为“数据中转器”。这个脚本定期例如每10分钟执行以下任务调用Open-Meteo API。将复杂的JSON响应提取并重组为Grafana原生JSON API数据源更容易解析的简单格式甚至直接转换为InfluxDB Line Protocol格式并写入一个本地的InfluxDB实例。暴露一个简单的HTTP端点例如使用Flask框架返回处理后的数据。例如脚本可以将数据整理为[ { “target”: “current_temperature”, “datapoints”: [[23.5, 1678886400000]] }, { “target”: “humidity”, “datapoints”: [[65, 1678886400000]] } ]这样Grafana使用最基本的“JSON API”数据源就能轻松获取这些结构规整的数据。这个方案增加了脚本维护的成本但换来了数据处理的极大灵活性和可控性。4. 仪表盘设计与reTerminal专属优化有了数据源接下来就是打造一个既美观又实用的仪表盘并针对reTerminal的硬件特性进行优化。4.1 面板布局与视觉设计针对720x1280的竖屏布局策略应是自上而下信息分层顶部区域品牌/位置使用“Text”面板大字体显示城市名称如“北京”和当前时间。可以设置背景色作为仪表盘的标题栏。核心指标区当前天气屏幕中央区域。使用超大号的“Stat”面板显示当前温度如“23.5°C”并配置颜色阈值例如低于0度蓝色高于30度红色。在其周围环绕稍小的“Stat”面板显示体感温度、湿度、风速、气压。使用“Gauge”面板显示紫外线指数或降水概率视觉上更直观。预报区下半部分。使用“Time series”面板展示未来24小时的温度和降水概率曲线。可以使用“Bar chart”面板展示未来几天的每日最高最低温度。底部状态栏显示数据最后更新时间、reTerminal的本地IP地址方便管理、以及系统负载等简单信息。设计技巧统一主题在Grafana的仪表盘设置中选择一个高对比度的主题如“Dark”确保在光线不同的环境下都能清晰阅读。利用单位为每个“Stat”面板正确设置单位°C, %, hPa, km/hGrafana会自动进行格式化。条件着色除了数值阈值着色还可以根据“天气代码”字段为整个面板或背景设置不同的颜色。例如晴天用浅黄色背景雨天用浅蓝色背景。这可以通过面板的“Override”功能实现。4.2 针对reTerminal的优化配置自动启动与Kiosk模式我们的目标是让reTerminal上电后自动全屏显示天气仪表盘。首先在reTerminal上安装一个极简的桌面环境如果还没装的话sudo apt install --no-install-recommends xserver-xorg xinit openbox chromium-browser创建一个自动启动脚本~/.config/openbox/autostart内容如下# 禁用屏幕保护和睡眠 xset s off xset -dpms xset s noblank # 以无痕模式全屏打开Chromium指向Grafana仪表盘 chromium-browser --noerrdialogs --disable-infobars --kiosk ‘http://localhost:3000/d/weather/home‘ 配置系统启动时自动登录用户并启动Openbox桌面。修改/etc/systemd/system/gettytty1.service.d/override.conf需创建添加ExecStart-/sbin/agetty --autologin 你的用户名 --noclear %I $TERM。然后在用户.bashrc末尾添加if [ -z “$DISPLAY” ] [ “$(tty)” “/dev/tty1” ]; then exec startx; fi。这样reTerminal启动后将自动进入图形界面并全屏锁定在天气仪表盘页面。触摸交互优化Grafana仪表盘本身支持触摸操作缩放、滚动。我们需要确保面板布局在竖屏下滚动顺畅。可以创建一个简单的导航仪表盘上面只有几个大按钮使用“Dashboard list”面板或自定义链接点击后跳转到详细的天气仪表盘或其他监控仪表盘。这样通过触摸就能切换视图。利用GPIO硬件按钮reTerminal的40针GPIO可以连接一个物理按钮。编写一个Python脚本使用RPi.GPIO库监听按钮按下事件当检测到按下时模拟键盘按键如F11切换全屏或AltLeft/Right切换浏览器标签通过pyautogui库或直接向X服务器发送事件来实现。这实现了硬件级别的交互控制。功耗与显示管理虽然reTerminal设计为常开但为了屏幕寿命可以设置定时关闭屏幕背光。这可以通过Linux命令vcgencmd display_power 0关和1开实现。可以结合cron定时任务在夜间无人时关闭屏幕早晨再打开。在Grafana仪表盘设置中将“Auto-refresh”设置为一个合理的值如“10m”。避免过于频繁的刷新如每秒增加不必要的网络请求和CPU负载。避坑指南二Chromium内存泄漏在树莓派上长期以Kiosk模式运行Chromium可能会遇到内存缓慢增长的问题。一个有效的缓解措施是在自动启动脚本中定期重启浏览器。可以使用一个简单的while循环脚本在每天凌晨自动重启Chromium进程。虽然粗暴但对于一个信息展示终端来说是简单有效的稳定性保障。5. 项目进阶与扩展思路一个基础的天气看板完成后这个项目还有巨大的扩展潜力可以将其升级为一个真正的多功能边缘信息中枢。融合本地环境数据reTerminal的GPIO接口可以连接温湿度传感器如DHT22、大气压传感器BMP280。通过Python脚本读取这些传感器数据并同样通过Infinity插件读取本地脚本输出的JSON或者写入InfluxDB再被Grafana拉取就可以在同一个仪表盘上并排显示“室内环境”和“室外天气”形成对比。增加日程与信息聚合利用Grafana的“Text”面板或支持Markdown的插件可以嵌入一个简单的日历、待办事项从某个在线API或本地文件读取或者RSS新闻摘要。这样reTerminal就变成了一个个人桌面信息中心。实现语音播报高阶玩法结合reTerminal的音频输出接口和语音合成工具如eSpeak或pyttsx3可以编写一个服务在特定时间如早上8点或当天气发生剧烈变化如温度骤降、下雨概率激增时自动语音播报天气概况。远程管理与监控将reTerminal上的Grafana实例配置为可被家庭内网访问这样你就可以在手机或电脑上随时修改仪表盘布局、查看历史数据。同时可以在仪表盘上添加一个显示reTerminal自身状态的面板如CPU温度、负载、内存使用率、磁盘空间实现自我监控。这个项目从一个小小的想法出发串联起了硬件操作、网络请求、数据转换、可视化设计和系统集成等多个环节。它不仅仅是一个天气显示工具更是一个理解现代物联网数据流和边缘计算应用的微型样板。当你看到那块精致的屏幕上动态更新着来自云端和本地的数据时你会感受到软硬件结合带来的实实在在的掌控感和创造力。动手去实现它过程中遇到的每一个问题和解决方案都会成为你技术工具箱里宝贵的经验。