DuetG Blog

Keep It Simple, Stupid

标签: automatic

  • 小米盒子3c刷CoreELEC运行Home Assistant Container

    小米盒子3c刷CoreELEC运行Home Assistant Container

    这是一个穷人乐,如果你像我一样手头上正好有一个小米盒子3c,一条公对公USB数据线,再加上拆机棒、镊子等工具,可以照着下面折腾一下。但如果你只是为了有一个好用的Home Assistant,建议花300左右购入一个Orange Pi 3 LTS自行制作Home Assistant Supervised,或者700多块直接买一个Home Assistant Green,就不要瞎折腾了,更不要为这个专门去收个二手盒子。因为Home Assistant Container只是一个基本的Home Assistant(仅比Home Assistant Core强些),不能安装加载项(Add-ons),更不能安装社区商店(Home Assistant Community Store,可用性以及可玩性都不高。

    Update:今天才知道Home Assistant所有版本都可以安装HACS,被官网那张图骗了好几年……

    如果我上面说的还算清楚,并且你已经看到这里了,那就一起来穷人乐吧。

    刷机包的相关信息和教程在国内是被作者发到了恩山论坛上,时间是22年5月份。文件和源代码托管在全球最大同性交友网站GitHub上,还请自行前去下载。如果没有游戏需求,还请下载9.2-mibox3-1.4,在这个版本仅有CoreELEC。论坛上作者的教程写的还算详尽,请直接参考论坛上的帖子来刷机,这里我主要讲刷机过程中和刷机后的一些问题。至于刷机软件Amlogic USB Burning Tool,作者本人说用的是v2.0.8,其他的版本我也试了几个,结果都不行,但v2.0.8一次成功,所以建议搜索下载这个版本安装。

    如果你没有公对公USB数据线,也可以找两根不要的数据线剪断重接。线准备好了之后,就可以用拆机棒拆机了。这里有篇小米盒子3s的拆机文章,在外壳上和3c基本上是一样的,可以参考一下。经验是要从后往前拆,一旦后面的卡口撬开了,剩下的用拆机片沿着接缝就能划开。不过一开始是比较紧的,不是很好拆。

    拆机完成后就是刷机了,这里我再具体说明一下需要短接的两个测试点是在屏蔽罩的一角和螺丝中间的两个铜测试点,而不是另一边并列三个测试点其中的两个。

    找作者在帖子中所说的步骤准备固件,刷机软件,并把设备与电脑连线等等。软件请务必确保在右侧仅选中“擦除flash”以及下拉菜单里选择“擦除所有”。用左手拿镊子保持短接,右手把电源打开,听到电脑响起硬件插入的响声后立刻取消短接,然后静等烧录完毕。如果中间有问题烧录中止了,请全部断开然后从头重新操作一遍。

    烧录完成后给盒子断电,拔掉数据线。接上HDMI显示器以及键盘或鼠标,插上电源重新开机,就可以看到CoreELEC的启动画面了。

    CoreELEC本身就是一个基于Kodi的极小化Linux系统,所以进去之后修改中文什么的在网上搜一下就可以找得到教程。如果首次登录的时候设置Wi-Fi出错跳过了这个步骤,可以到设置菜单最下面的CoreELEC菜单里重新录入Wi-Fi密码,蓝牙遥控器也需要在这个菜单下重新连接。遥控器进入配对模式是需要按住Home键和菜单键两个不松手,稍等片刻就进入配对模式。如果没有切换成中文就去连接遥控器,会在蓝牙上看到一个名称都是方块的设备,这个就是遥控器没错了。

    如果语言列表里没有中文,需要到插件菜单里下载中文,但在切换中文前请务必把皮肤的字体改为基于Arial,否则整个UI也会变成方块。

    在插件中找到CoreELEC的官方源,在服务程序里找到Docker安装好,并在设置里开启ssh。然后通过ssh进入CoreELEC的命令行,使用以下命令来安装并启动Home Assistant Container。默认用户名是root,默认密码是coreelec。

    docker run --restart always -d --name homeassistant -v ~/homeassistant/config:/config -e TZ=Asia/Shanghai --net=host ghcr.io/home-assistant/home-assistant:stable

    待镜像下载完毕容器跑起来之后,使用你的盒子的IP,端口8123,就可以访问Home Assistant。

    最后说一下遥控器。刚刷好的CoreELEC,把遥控器的连牙蓝上了之后,遥控器的电源键会一键关闭盒子上的系统(并不会彻底关闭电源,也不能开机)。但这种设定很容易带来误操作的麻烦。在网上搜了搜,找到了重新定义keymap的解决方案,一个CoreELEC官方论坛上的帖子。根据官方开发人员的回复,在电脑资源管理器的地址栏输入

     \\你的小米盒子ip\Userdata\keymaps

    可能会需要你输入用户名和密码,由于之前没有修改过密码,所以用户名是root,密码是coreelec。

    打开文件夹后把帖子里的keymaps.xml下载并上传到这个文件夹里,重启以下系统,之后遥控器的电源键就只能触发电源菜单而不会直接关机了。

  • 香橙派安装Home Assistant Supervised

    香橙派安装Home Assistant Supervised

    Home Assistant

    一款用于智能家居的自由开源软件,旨在成为智能家居设备的中央控制系统,专注于本地控制和隐私。通过使用Android和iOS的配套应用程序,或使用支持的虚拟助手(如Google Assistant或Amazon Alexa)通过语音命令,可以访问基于Web的用户界面。

    香橙派

    香橙派(Orange Pi)是深圳市迅龙软件有限公司旗下开源产品品牌,迅龙软件成立于2005年,是全球领先的开源硬件和开源软件服务商,致力于让极客、创客、电子爱好者享用到来自中国的优质、低价的科技产品,通过大规模的社会化协作去创建一个更加美好的信息化人类文明。

    自从买了HomePod mini,在还没收到货的时候就开始盘算着怎么让HomePod能和家里的小米设备联动起来,实现通过Siri来控制小米设备。一开始在网上找的了一种通过米家App生成Siri快捷指令从而控制小米设备的方法。仔细研究了一下,发现这个方式并不合适自己:不但需要对每一个设备的每一种操作逐一生成快捷指令并录音,更麻烦的是即便设置完成,使用的时候还需要手机和所有设备同处一个局域网下才可以。这已经和“独立通过HomePod来控制设备”这个初衷背道而驰了。细想一下,这个方案合适的人群应该是单身并且小米设备较少的用户,通过简单的添加就可以零成本实现联动。满足这样条件的可以自行搜索一下,这里就不多做介绍了。

    在Goolge以及微信上搜索“HomeKit 小米”关键字,最后发现少数派上介绍智能家居的文章实在不少,后来又在知乎上看到了篇文章,并在文章下面的评论里找到了另一篇用Android手机安装Home Assistant的指南。又在文章里找到了这篇《香橙派安装HomeAssistant-supervised》,总算是确定了使用Home Assistant Supervised作为中控的方案。

    由于Home Assistant在不断迭代更新(Core更新的速度很快),虽然当时照着上篇教程搭配少数派里的文章最终实现了联动,但体验较差,并且在使用两个月后突然就失效了。于是又做了研究,最终完美实现,促成了写这篇blog的动机。鉴于前面提到的那篇教程有些过时了,这里我就从头再写一遍吧。

    硬件要求

    • 香橙派 3 LTS + 电源(可在香橙派官网页脚给出的官方销售链接里购买)
    • 闪迪64G TF卡(感觉买64G比32G划算,实际32G也可以)
    • TF卡USB读卡器(写卡用)
    • 香橙派 3 LTS 保护壳(不一定要买散热套装,官方旗舰店的透明黑壳也是没问题的,可以加一对散热片)

    1. 为香橙派烧录 Debian 11 系统

    点击下载官方镜像,提取码:9d7v (百度云盘)

    如果可以访问Google Drive的话,也可以去英文官网给出的链接下载,不用注册且速度很好。

    根据Home Assistant Supervised官方安装指南只能安装在Debian 11 Bullseye上 (Ubuntu也不行) 目前要求安装在Debian 12 Bookworm上,但香橙派官方只给香橙派3 LTS做了Debian 11系统,我们后面会有相应的解决方案。所以我们要下载的文件是:

    Orangepi3-lts_3.0.8_debian_bullseye_server_linux5.16.17.7z

    Windows平台上的烧录方法参见香橙派 3 LTS 用户手册中的(推荐使用balenaEtcher)

    2.4. 基于 Windows PC 将 Linux 镜像烧写到 TF 卡的方法

    点击下载官方用户手册,提取码:g4xe (百度云盘)

    2. 通过 SSH 连接香橙派

    1. Windows用户可以在Microsoft Store里安装Windows Terminal,或者使用PuTTY
    2. 烧录好系统的TF卡插回香橙派,用网线连接路由器和香橙派,并通电启动香橙派。
    3. 在路由器中查看香橙派的IP地址。
    4. 在终端里输入
      ssh root@香橙派IP地址
      香橙派IP地址请换成实际地址
    5. 输入密码 orangepi

    3. 修改系统 CGroup 至 v1

    这是和上面那篇教程完全不同的地方,那篇并没有提及修改系统cgroup版本。之前参考着安装的时候,虽然在安装程序上会提及cgroup版本变更失败,但在使用过程中并没有弹出任何错误。不过这次重装完成后进入Home Assistant后台会立刻受到关于cgroup版本不支持的通知。所以还是在安装Home Assistant前先把系统搞好再说下一步吧。

    CGroup

    cgroups,其名称源自控制组群(英语:control groups)的简写,是Linux内核的一个功能,用来限制、控制与分离一个进程组的资源(如CPU、内存、磁盘输入输出等)。

    从 cgroup v2文档可以查到,自Debian 11 bullseye起,Debian的cgroup默认就是v2了。试着刷了一下Debian 10 buster查了查,果然还是v1。然而根据Home Assistant官网的信息,Home Assistant Supervised只能安装在cgroup v1的系统上,且只能是Debian 11 bullseye。这就意味着,无论如何都要将bullseye系统默认的v2修改成v1(我曾试过将buster升级到bullseye,cgroup妥妥自动从v1升级成了v2)。

    虽然在后续安装Home Assistant Supervised的环节,安装包会用自动脚本让cgroup从v2切回v1,但这个操作仅限于非arm版的Debian。因为普通的Debian使用的bootloader是GRUB,这个脚本也是针对GRUB设计的,并没有考虑其他bootloader。而香橙派运行的是arm版的Debian,bootloader是U-Boot。这导致安装包的自动脚本会报错,无法把cgroup切回v1,我们只能手工修改香橙派上的cgroup。

    首先在命令行运行下面命令来确定系统的cgroup版本

    stat -fc %T /sys/fs/cgroup/

    如果是cgroup v2,返回 cgroup2fs
    如果是cgroup v1,则返回 tmpfs

    接下来修改cgroup到v1:

    1. 输入 cd /boot ,进入 /boot 目录
    2. 输入 cp boot.cmd boot.cmd.bak ,备份 boot.cmd
    3. 输入 vi boot.cmd ,进入到编辑界面
    4. 无视最上面的“DO NOT EDIT THIS FILE”
    5. 找到第38行:
      if test "${docker_optimizations}" = "on"; then setenv bootargs "${bootargs} cgroup_enable=memory swapaccount=1"; fi
    6. 按 i 键键入insert编辑状态,在swapaccount=1后面加上空格并输入:
      systemd.unified_cgroup_hierarchy=0
      修改后的第38行如下:
      if test "${docker_optimizations}" = "on"; then setenv bootargs "${bootargs} cgroup_enable=memory swapaccount=1 systemd.unified_cgroup_hierarchy=0"; fi
    7. 按 esc 键退出insert编辑状态,输入 :wq 回车完成保存并退出(对 vi 操作不熟悉的可以在网上查一下教程)
    8. 在命令行输入以下指令并回车,生成新的 boot.scr
      mkimage -C none -A arm -T script -d /boot/boot.cmd /boot/boot.scr
    9. 输入 reboot ,重启香橙派

    重启完成后用SSH连接进入命令行,再次使用下方命令查看cgroup版本

    stat -fc %T /sys/fs/cgroup/

    不意外的话应该返回 tmpfs,cgroup版本修改完成。

    4. 更新系统现有软件

    输入 apt update,更新软件源
    再输入 apt full-upgrade,更新现有软件

    5. 使用以下代码安装依赖

    接下来的步骤基本上就是Home Assistant官方的安装步骤了。安装过程中会提示部分软件已经安装过了,可忽略相关提示。

    Update:2024.01.15

    感谢网友提醒,文章已随官方步骤做修改。如后续官方程序再次有变动,请以上方链接的官方步骤为准。

    apt install \
    apparmor \
    cifs-utils \
    curl \
    dbus \
    jq \
    libglib2.0-bin \
    lsb-release \
    network-manager \
    nfs-common \
    systemd-journal-remote \
    systemd-resolved \
    udisks2 \
    wget -y

    6. 使用以下代码安装Docker-CE

    $ curl -fsSL https://get.docker.com -o get-docker.sh
    $ sh get-docker.sh --mirror Aliyun

    7. 安装OS-Agent

    先在这里查询最新的OS Agent版本:
    https://github.com/home-assistant/os-agent/releases/latest

    接下来用 wget 命令下载我们需要的安装包,注意选择正确的架构,香橙派应当选择 aarch64,如os-agent_1.6.0_linux_aarch64.deb

    右键复制安装包的下载地址,粘贴至终端,完成下载使用命令如下:

    $ wget https://github.com/home-assistant/os-agent/releases/download/1.6.0/os-agent_1.6.0_linux_aarch64.deb

    注意将地址替换成最新的版本,完成下载后再用以下命令安装:

    $ dpkg -i os-agent_1.6.0_linux_aarch64.deb

    8. 安装Home Assistant Supervised

    之前教程里相关的其他操作目前都被集成到了新版的安装包脚本里,所以只需要下载最新的安装包就可以了。

    Update 2024.01.15
    注意:由于最新的 homeassistant-supervised.deb 要求的Debian系统已经升级到12 Bookworm了,在Debian 11上安装的过程中检查依赖会报错缺少 systemd-resolved 这个包,而这个包是Debian 12上才有的,我们需要在安装命令中使用 --ignore-depends=systemd-resolved 来忽略掉这个报错。

    命令如下:

    $ wget -O homeassistant-supervised.deb https://github.com/home-assistant/supervised-installer/releases/latest/download/homeassistant-supervised.deb
    $ dpkg -i --ignore-depends=systemd-resolved homeassistant-supervised.deb

    安装过程中会看到切换cgroup版本的脚本执行失败的提示,不用管它。

    紧接着会自动进入蓝色选择机器类型的界面,注意选择机器类型 qemuarm-64

    如果选错了类型可以执行 dpkg -P homeassistant-supervised,卸载后再重新安装。

    默认的 $DATA_SHARE 文件夹位置在 /usr/share/hassio,所有Home Assistant相关的文件都在这个文件夹里。

    如果想更换位置需要在安装的时候指定,安装命令如下:

    $ DATA_SHARE=/想要指定的homeassistant文件夹位置 dpkg -i --ignore-depends=systemd-resolved homeassistant-supervised.deb

    9. 确认安装

    执行 docker ps 来查看容器的状态,一般来说需要20分钟左右会完成所有镜像的拉取和执行。如果很长时间都没有任何容器在运行,很可能是 ghcr.io 这个网址不通。需要执行 ping ghcr.io 来是否确认连通。

    如果不通需要查询 ghcr.io 的IP地址,并修改主机的 hosts 文件。具体方法请自行搜索,不再赘述。

    10. 使用Home Assistant

    浏览器地址栏输入 http://香橙派IP:8123,即可访问Home Assistant的管理后台,如果显示需要等待,就再多等一会儿。安装彻底完成后会显示注册用户的界面。关于Home Assistant的用法可以在少数派里搜到很多,这里不再多说,主要提一下Home Assistant社区市场(HACS)的安装方法,和小米设备集成的推荐。

    • HACS相当于为Home Assistant提供了更多的功能扩展,官方称之为集成,而非加载项。
      安装方法:
      1. 前往加载项商店 (第一次打开My Home Assistant页面需要配置一下,在框内输入 http://香橙派IP:8123,并保存,之后可以自动跳转)
      2. 搜索 SSH,安装社区版的 SSH & Web Terminal(如果搜索 SSH 没有任何结果,需要在你的用户资料下开启高级模式)
      3. 在 SSH & Web Terminal 的配置页面,选项一栏中找到 password: "" 一行,在引号中设置一个SSH密码(密码随便)。在网络一栏中设置一个SSH端口(数字随便)
      4. 在信息页面开启在侧边栏显示,并点击下方的启动
      5. 刷新页面后在左侧侧边栏找到 Terminal,点击并开启终端
      6. 在终端内执行 HACS 下载脚本
      wget -O - https://get.hacs.xyz | bash -
      7. 完成下载后通过添加集成,搜索HACS,跟着步骤便可完成安装和配置。
    • 关于小米设备集成主要介绍一下好用的HACS小米集成。
      之前查看少数派的文章,都在推荐”Xiaomi MIoT“这款集成,GitHub仓库地址是:
      https://github.com/ha0y/xiaomi_miot_raw
      但实际使用体验感觉一般,代码目前最后一次更新是4月10号,也有7个月没更新过了。这次重装之后尝试了”Xiaomi Miot Auto“这款,仓库地址是:
      https://github.com/al-one/hass-xiaomi-miot
      目前最后一次更新是18天前,实际用下来感觉非常不错,是目前我主力使用的小米集成。

    全文完

    Last Update: 2024.01.15

  • 利用Huginn监控iPad mini发售

    利用Huginn监控iPad mini发售

    阅读本文需要有一定的Huginn和IFTTT使用基础

    作为一个iPad mini 2的老用户,对今年的iPad mini说实话还是很满意的。只不过一直看好的蜂窝网络版始终显示还在报批中,这让我非常的恼火。一来不知道猴年马月能用上,再来又害怕没赶上开卖,下单又要等更久的时间。毕竟现在iPhone 13 Pro官网要等上一个月才发货,而又有传闻蜂窝网络版iPad mini 6就是因为把芯片匀给了iPhone才推迟了上市。总之众说纷纭,让我十分不爽。

    年中的时候一个偶然的事件让我深度地研究了一下Huginn的用法,又在腾讯云开了台服务器(国内的服务器真不知道还能干些啥),把Huginn以Docker的形式挂了上去。虽然后来原本计划用到Huginn的事情没能成行,但机器倒也还一直跑着。于是就决定利用Huginn来完成iPad mini发售的监控。下面简单说一说思路和具体操作。

    Huginn作为一个自动采集平台,虽然没有python来的自由,但贵在有用户界面,并且系统稳定(至少半年跑下来非常稳)。但单独使用Huginn来抓取页面很多时候是会失败的,原因在于这个需要抓取的页面是动态生成的,需要浏览器来渲染生成才可以(这是半年前我花了一两天才想明白的问题)。这次抓取苹果官方商店页面时也同样遇到这样的情况,单独使用Website Agent是获取不到页面的。这个时候还需要一个能够让页面完成渲染的服务,我这里用的是browserless。browerless也是开源软件,在服务器里多跑一个Docker容器就完事儿了。

    那么总结一下工作逻辑:
    1、使用Post Agent调用browerless的API完成页面的渲染,设置每十分钟渲染一次
    2、使用Website Agent获取渲染完成的页面并解析(如果是监控的话,找出可能变动的位置)
    3、使用Data Output Agent完成RSS输出
    //以上是在Huginn中完成
    4、使用IFTTT的rss to email Applet(这样的Applet有很多,搜一下就有了,不需要自己写)。把rss地址设置成Huginn的RSS地址,邮箱可以设置成QQ邮箱。
    //以上是在IFTTT中完成
    5、利用微信中的QQ邮箱获取提醒

    放一下Huginn每个Agent的代码

    //Post Agent
    //留意browserless需要设置Token
    {
      "post_url": "http://[browserless_IP]:[browserless_Port]/content?token=[browserless_Token]",
      "expected_receive_period_in_days": "1",
      "content_type": "json",
      "method": "post",
      "payload": {
        "url": "https://www.apple.com.cn/shop/buy-ipad/ipad-mini",
        "gotoOptions": {
          "timeout": "10000",
          "waitUntil": "networkidle2"
        }
      },
      "emit_events": "true",
      "no_merge": "false",
      "output_mode": "clean"
    }
    //Website Agent
    //抓取的是标题位置的div,因为下方会有小字说明正在等待批准,开售后小字会被移除
    {
      "expected_update_period_in_days": "2",
      "data_from_event": "{{ body }}",
      "type": "html",
      "mode": "on_change",
      "extract": {
        "url": {
          "value": ".",
          "xpath": "//*[@id=\"as-standardnav\"]/div/div[2]/div[1]/a/@href"
        },
        "title": {
          "value": "normalize-space(.)",
          "xpath": "//*[@id=\"root\"]/div[2]/div[3]/div[2]/div[1]/div/div/h1"
        },
        "description": {
          "xpath": "//*[@id=\"root\"]/div[2]/div[3]/div[2]/div[1]/div",
          "value": "normalize-space(.)"
        }
      }
    }

    Data Output Agent没什么特殊的设置,按照Website Agent把地址,标题和描述设置好就行了。

    最后说一下成果。今天上午突然微信收到邮件提示可以买了,鉴于每十分钟轮询一遍网页,理论上我下单的时间应该是够早的,但在网站给出的发货时间已经是4-5周了。没办法,即便如此还是要等的。(目前网站提示的已经是5周后了)看来虽然iPad mini 6不错,但似乎也没有那么抢手。所以上面这一通折腾我到底又是为了什么呢?