实现了消息发布订阅和数据存储,接下来就是怎么用数据了。数据展示就是可视化,可以用的软件很多,Grafana是开源软件中用得最多的(吧?)。由于用的人多,教程也多,所以只要注意以下几点就行了:

  • 安装包去官网找,安装过程很详细,只是要记得一定要选择和自己主机的CPU和操作系统对应的安装包,否则安装不成功。
  • 打开端口。
  • 新建仪表盘时,如果SQL语句写了后可视化窗口里却空空如也,那八成是没有指定数据库,引用的表要写成XXX.YYY,其中XXX是数据库名,YYY是表名。

        二十多年前,似乎还在用着33.6K的modem时,MP3刚刚发明出来,在网上慢吞吞地下载了很多歌曲和乐曲,很多很喜欢的歌曲和乐曲就是那时候发现的。只是那时候网上的搜索引擎功能还很弱,网上的信息也很少,即使觉得一首歌很好听,也找不到有关这首歌的太多的信息,尤其有时候歌名都不完整,就比如这首小号曲,下载下来的名字叫wonderland,在用上apple music后就用这个名字搜,无奈同名的太多,都不是这一首。直到前天在微信的视频号中发现有人发这首,才知道了这首曲子的全名,用这个名字果然也在apple music中搜寻到了。嗯,果然对于音乐来说,微信视频号比小红书强多了。

        EMQX接受到消息后,存储到TDengine数据库的方法就是设定规则,方法如下:

  • 建立规则,用SQL语句把需要存储的消息及相应字段筛选出来(有可能接收到的是发布端的心跳包,这个是不需要存储的):SELECT XXXX,payload.XXX,XXXXX,XXX,XXX FROM "XXX/XXX/XXXX" WHERE is_null(payload.XXX)=false
  • 在规则的动作输出中选择TDengine,写一条在数据库中插入数据的SQL语句:insert into XXXXX using XXX tags('XXX','XXX') values (${XXX},'${XXX}', ${XXX}, ${payload.XXX}, '${XXX}'),第一个字段记得永远要用时间戳,字段是int或者float的,不需要加''。
  • 在规则建立页面有调试功能,可以在设定规则后,用MQTT.fx发布数据,然后观察是否成功存储到TDengine中,以此来判断和排除语法错误。
  • TDengine是时序型数据库,规范建表的方法是先建超级表stable,需要存储的字段都在超级表中事先确定,然后每个设备用一个新表table存储数据,表会继承超级表的字段,不需要再次定义,但也意味着不能随意修改增减,所以超级表设计时一定要考虑周全,否则只能逐个增加超级表的字段。
  • 规则的动作输出也可以选择为消息再输出,把筛选出来的消息以另外一个主题重新发布出去。
  • 同理,当规则的SQL语句中增加了数据的比较和筛选功能(如数值大于或小于某个设定值时),再设定一个消息再输出,就实现了报警功能,这样做的好处是规则的设定完全是在服务器端,前端硬件设备不需要做任何设定,这样灵活性无疑大了很多。筛选出来的数据同时也可以存储到TDengine中,实现报警数据的记录。

        Arduino调试过程中,会出现一些匪夷所思的问题,表面上看来是闹鬼,其实都各有原因,只不过原因隐藏得比较隐秘。比如:

  • 用UNO调试一个电路,当单独挂载一个SSD1306的IIC屏时,使用例程和自己的程序都正常,但一旦放到一个有三个IIC器件的系统中就始终无法编译通过,想过可能是地址的问题,但查下来地址都不重复,最后发现是通常用的SSD1306库文件消耗内存太大,UNO这样的内存有限的MCU当只运行这个库时没有问题,一旦加载的库多了,内存就不够分,体现在在编译显示分配失败。解决办法是找一个内存消耗小的库,或者换成MEGA2560,显然前者更有可行性。
  • 一个串口屏的应用,接收到信息后报警,用一个按钮中止报警修改报警背景颜色,结果程序编译完成后其他功能都正常,唯独串口屏无法显示设定的初始界面,总是一晃就变成空数据界面,怎么调整程序都不行,最后发现是按钮对应的IO口异常,虽然软件做了上拉,但高电平时只有2V,造成进入LOOP循环后程序认为按钮已经被按下,串口屏自动显示报警中止后设定的画面,此时又没有数据,只能显示一个空数据画面,换一个IO口就一切正常了。
  • Arduino里将时间戳转换为正常的日期和时间格式,网上的Arduino time库现在的IDE用不了,试验了安装time库可以进行转换,然而转换出来的日期和时间始终不对,最后发现这个库的转换功能只能用于转换10位的时间戳,如果你用的是13位的时间戳,那必然不对,需要先将13位的时间戳截取为10位,才能正确转换。

        UsartGPU串口屏是最常用的串口屏,最近在应用过程中遇到问题,串口语句在GPUMake中显示正常,但移到Arduino后就始终无反应。经过长时间排查,直到查阅了厂家网站www.ai-diy.cn上的文档才发现问题所在,这几个坑真不容易注意到,下次应用一定要注意:

  • 要在串口屏上显示汉字,不能在Arduino IDE中直接引用汉字,因其编码格式为GB2312,而串口屏需要ANSI格式,解决办法是在记事本里以ANSI格式新建一个hz.c,里面写一条语句 const char hz[][32]={"XXX","XXX","XXX",......},每个字或每个词、短语作为数组元素添加其中,注意数组的长度要因放入的汉字多少而定,一个汉字需要两个字节。将其放到ino文件的相同目录中,在编写Arduino程序时将其纳入:#include "hz.c",在发送时用hz[X]引用相应汉字。
  • 发送一堆串口命令时,一定要在最后一条串口数据发送时加上换行符:Serial.println("XXX");否则串口会认为命令还没有接收完毕,不会有任何动作。
  • 如果屏上显示有稀奇古怪的问题,一定是在串口数据编码过程中出现了格式问题,比如少了一个),引用hz[X]时要在其前后加上'。
  • 串口屏使用的是GB2312编码,Arduino用的是UTF-8编码,后来发现一个不需要很麻烦的办法:在Arduino中安装UTF8TOGB2312的库,就可以在程序中实时转换编码,实现串口屏的中文文字实时显示。

        搭建方案是让DeepSeek帮助制定的,技术路线是:EMQX作为MQTT服务器,通过设定规则和连接器将接收到的信息传送给TDengine时序数据库存储数据,用Grafana作为数据可视化工具。安装调试过程中颇掉了不少坑,记录如下,以后再部署时避免弯路。

  • EMQX与TDengine安装时注意选择与操作系统适配的版本。
  • TDengine安装后,要启动taos适配服务:systemctl start taosadapter,否则与EMQX的连接无法成功。
  • 使用公众云平台部署时,EMQX要打开1883,18083等端口,TDengine要打开6041端口。
  • EMQX里设置规则时,SQL的语法与MY SQL的语法并不完全一致,有的语句和功能无法直接使用,要查阅它自己的SQL语法手册,TDengine同理。
  • EMQX和TDengine在同一台服务器上部署时,如果不使用Docker,连接器地址要选择127.0.0.1:6041,用Docker部署时则用相应容器的地址。
  • MQTT消息的格式一般会用JSON格式,同一台终端可能同时会发送心跳包(特定字符)以维持连接,在转发存储时设定规则,可以在SQL语句尾部加上 WHERE is_null(payload.XXX)=false 以过滤掉非JSON格式包。
  • TDengine在创建数据库时,一定要加上数据保留周期 KEEP 365,这是保存一年,如果不设定,默认保存10年,服务器空间压力太大。要加上允许修改的参数 UPDATE 1,否则只能整个表删除。
  • TDengine建数据库后先建超级表,把需要记录的字段设定后再建子表,子表继承超级表结构,只用设定TAGS来说明终端的位置和类型等即可。
  • 虽然有人物联网的CAT-1模块在透传模式时只用向其发送JSON数据,但在EMQX接收时会收到包括时间戳、用户ID、QOS等信息在内的完整数据包,可在EMQX规则设定中打开调试模式试验查看。数据戳来源可解析收到的payload.timestamp,也可以直接引用函数NOW。

        大约二十多年前,大学毕业没有几年,终于有了自己的第一台电脑,在互联网上看到一个运动风筝的小短片,立刻被配乐吸引了。一首优美的咏叹调,画面中风筝随着女声二重唱的旋律起伏在蓝天起伏翻飞,虽然分辨率只有320*240,那种优美仍然动人心魄,时隔近三十年,仍久久难忘。
        现在知道了,这首咏叹调是德利伯的歌剧《拉克美》中的《The Flower Duet》。

        用Server酱来推送domoticz系统里的天气预报、家中温度实况等已经有几年了,一个星期前突然收不到推送信息,诡异的是从中国气象局网站抓取的卫星图像的推送正常,但就是domoticz的推送异常,在笔记本上运行了下脚本是正常的,可以收到推送,但在树莓派上SSH操作就是返回400异常。反复试验,再仔细看了Server酱的官网说明,猜测可能是urlencode编码的问题,在脚本中加了一段urlencode编码的语句,上传树莓派后运行正常。要注意的是python中urlencode编码需要先建字典,将url中的参数以字典方式呈现,然后转换为urlencode编码,再与url的网址部分相加,此时向网站发送就一切正常。猜测是Server酱的后台代码进行了微调造成了这种情况的发生。自己做的系统就是这样,需要不断修复发生的问题,但是规范代码确实很重要。

        2022年自制了魔镜固件,用chromium浏览器,koisk方式全屏显示,从和风天气拉取天气预报,从RSS源拉取新闻速报和名人名言,从家里的Domoticz拉取室内温度等实时数据,反复调整HTML页面,总算达到一个比较和谐美观的效果。今天重新上电,发现数据不能更新,无WIFI,必须用有线连接,经查原因如下:

  • 不能更新数据的原因是和风天气预报API发生变换,以前是V5版本,现在用的是V7版本,指令模式不同
  • 不能更新数据的第二个原因是无法从Domoticz服务器拉取实时数据,因为之前增加了Docker用来搞内外网穿透,为了安全设置了用户名和密码,这时再读取就会发生错误,查Domoticz文档改用增加header的方式,用户名:密码转换为Base64模式后,增加‘Authorization’:‘Base XXXXXXX......’的头,这样就能读取到数据了
  • WIFI不能使用的原因不明,用了多种方法都没有用,最后是修改/etc/network/interfaces,改为如下,要注释掉wpa_supplicant.conf那一行。

    iface lo inet loopback
    
    iface eth0 inet manual
    
    auto wlan0
    allow-hotplug wlan0
    iface wlan0 inet dhcp
    wpa-ssid "MySSID"
    wpa-psk "topsecret" 
  • 退出koisk全屏模式的快捷键是ctrl+w

微信图片_20250502144657.png

        ChatGPT-4o的以图生图功能可以将照片转换为吉卜力风格,只需要以下两步:

  • 下载Edge浏览器的deepsider插件,安装,注册
  • 选择GPT-4o-image模型,上传照片,输入以下关键字:

    请将我提供的照片转换为一张现代高清的吉卜力动画风格插画,保留照片的基本构图与主体元素。
    具体要求如下:
    使用细腻、干净、明亮的手绘风格进行重绘。
    构图不变:人物和背景的布局与原图保持一致。
    人物主体保留:保留人物表情和动作,表现出自然、富有情感的状态。
    色彩处理:色彩鲜明自然,避免泛黄或昏暗,整体氛围应温柔、通透、有情感张力。
    线条风格:线条清晰流畅,细节丰富,具有手绘质感。
    尺寸比例:输出图像尺寸与原图一致。
  • 生成即可,每天每个账号可以免费生成10张照片。

        偶有不稳定,不过看在免费的份上,抽疯的话第二天再用啦。可以修改关键字达到你想要的效果,比如“女士的脸和身体更瘦一些”“背景更换为龙猫里的森林”之类。多人照片一定要主体突出,人不能太多,人太多或主体不突出最好裁切下。

2h4iZBrx4a0PrLa6SbHvzWEW7Rv1IM.png
c9gB7v8Sz6FmykwgsDMK38fFkm2qyI.png
fSCwrUSiGHW9zqodMf8pnOzM96NzXq.png
HbpRVclS8w82NEsprwunxBah0qPCcJ.png
uTcqUR1G993r10nC4FDhERuy7g9d5E.png
Vx0ib4qVPSYrGnHk5DlgycE85H05ZZ.png
wNu7Or0UGXJn2enW9LhWq7tNfG2KTE.png
zDsKWacOOLZSwXGthjJPheHSIjUQoz.png
微信图片_20250403101407.png
微信图片_20250403103652.png
微信图片_20250403104843.png
微信图片_20250403105305.png
微信图片_20250406193506.png
微信图片_20250406194049.png
微信图片_20250406195507.png