概述
警告:这个代码非常新和不成熟。它对我有用,但需要专业知识才能使用。
本仓库包含一个程序,旨在替换Eight Sleep Pod 3上的 dac
进程,使用户能够在没有任何与Eight Sleep服务器交互的情况下,在本地与pod进行交互。
很明显,这个项目没有得到Eight Sleep的认可。您需要对您对pod采取的任何行动负责。
兼容性
目前仅在基于Variscite VAR-SOM-MX8M-MINI的Pod 3上进行了测试。
示例主板:
Eight Sleep应用程序中的示例硬件信息:
说明
使用方法:
- 关闭pod电源
- 拆除Pod 3背面的风扇护罩
- 拧下顶部固定顶面板的两颗螺丝
- 撬起顶面板的塑料部分,直到看到将顶面板固定在侧面板上的夹子,停在这里
- 拆除设备正面的织物网格面板。顶部有两个夹子钩在塑料侧面板上。可以用螺丝刀推开这些夹子。
- 解开固定在水供应圆柱体顶部的夹子,拆下顶面板。现在可以接触到逻辑板。
- 有一个小型嵌板,看似插在RAM插槽上。拆下该板上的螺丝和天线。
- 小心地向上拉开板子,远离热泥。
- 拉出板子。
- 去掉暴露出的microSD卡槽上的胶水
- 取出microSD卡
- 修改microSD卡首个分区中的
/opt/images/Yocto/rootfs.tar.gz
文件:- 在
/etc/shadow
中设置root密码 - 在
/etc/NetworkManager/system-connections/<something>.nmconnection
中添加NetworkManager
配置文件 - 将SSH密钥添加到
/etc/ssh/authorized_keys
(可选,同时删除Eight Sleep的密钥)
- 在
- 插入microSD卡
- 插入逻辑嵌板
- 重新连接天线
- 按住pod背面电源线旁边的小按钮。在按住按钮的同时接通电源。
- 几秒钟后,您应该会看到pod的指示灯闪烁绿色。这表示设备正在执行出厂重置,使用
rootfs.tar.gz
文件。 - 最终它会停止闪烁绿色并连接到wifi。您现在应该能够使用
rewt
账户通过ssh登录设备。您也可以先以rewt
登录,然后输入su
并输入 root 密码来登录root
。
您现在可以为Pod 3编译这个程序:cargo build --target aarch64-unknown-linux-musl
(使用 musl 以使静态二进制文件可用)。通过ssh将其复制到您的Pod上,您应该就可以运行它了,尽管您需要先以root运行 systemctl stop dac
来关闭监听相关unix套接字的股票 dac
。
您可能还想禁用Eight Sleep的更新和遥测。您可以用以下命令完成:systemctl disable --now swupdate-progress swupdate defibrillator eight-kernel telegraf vector
。frankenfirmware
二进制文件仍将数据发送到 raw-api-upload.8slp.net
。如果您想处理这个问题,请将 raw-api-upload.8slp.net
添加到 /etc/hosts
文件中。
API
GET /hello
: 检查进程是否可以与固件对话。如果可以,它将返回ok
,否则为空。GET /variables
: 获取Pod的当前状态,如温度。POST /alarm/<left/right>
: 设置闹铃设置。请求主体必须是以下形式的JSON:{"pl":50,"du":600,"tt":1700000000,"pi":"double"}
pl
是振动强度的百分比。du
推测是闹铃的最大持续时间,单位为秒。tt
是应该触发闹铃的Unix时间戳。pi
是振动模式。double
是旧式的"强烈"振动,rise
是较新的温和振动。
POST /alarm-clear
: 清除闹铃。不清楚是否需要请求主体。POST /settings
: 更新常规设置。请求必须是JSON映射。只知道lb
,它是pod LED的百分比强度。POST /temperature/<left/right>
: 设置指定床侧的目标温度。单位似乎是摄氏度的十分之一,所以40代表4度。请求主体应该是编码为纯文本的整数。直到持续时间也被设置后,装置才会开启。POST /temperature-duration/<left/right>
: 设置 pod 应该关闭的秒数。股票 Eight Sleep 逻辑是定期将其设置为7200,并在 pod 应该关闭时通过将其更改为0来手动关闭。POST /prime
: 大概是预热 pod。采用纯文本布尔值(true
或false
)作为请求主体。不清楚这意味着什么。
Home Assistant
可以使用 rest_command
集成轻松将API集成到Home Assistant中:
rest_command:
set_alarm:
url: http://<pod_ip>:8000/alarm/right
method: post
payload: '{"pl":{{strength}},"du":{{duration}},"tt":{{timestamp}},"pi":"{{pattern}}"}'
set_temp:
url: http://<pod_ip>:8000/temperature/right
method: post
payload: '{{temperature}}'
set_temp_duration:
url: http://<pod_ip>:8000/temperature-duration/right
method: post
payload: '{{duration}}'
相关设置可以作为数据传递。这里是一个根据日历事件名称设置温度的自动化示例,事件名称就是所需的温度:
alias: Bed Calendar-driven Temperature
description: ""
trigger:
- platform: calendar
event: start
offset: "0:0:0"
entity_id: calendar.sleep
condition:
- condition: template
value_template: "{{trigger.calendar_event.summary | is_number}}"
action:
- repeat:
sequence:
- service: rest_command.set_temp
data:
temperature: "{{trigger.calendar_event.summary}}"
- service: rest_command.set_temp_duration
data:
duration: 7200
- delay:
hours: 0
minutes: 30
seconds: 0
milliseconds: 0
while:
- condition: template
value_template: "{{as_timestamp(trigger.calendar_event.end) > as_timestamp(now())}}"
mode: single