自用 MacBook Pro USB-C 扩展坞介绍和对比

四款Type-C扩展坞

自从我淘汰了 2015 款 MacBook Pro,买了新款 MacBook Pro 16 寸版本之后,因为它只有四个 USB Type-C 口,去掉了 2015 款自带的 USB Type-A,以及 HDMI 接口,导致在使用 USB Type-A 设备,以及外接显示器时,需要额外的扩展坞才可以实现。

为了解决这个问题,就必须要好好找找便宜又大碗的扩展坞了。

筛选目标

基于 MacBook Pro 雷电 3 接口高达 40Gbps 的带宽,可以做到一根线实现显示器输出、电源输入以及扩展 USB-A 数据上行,因此在筛选目标产品时,会优先考虑以下几个功能是否能实现:

  • 一根线实现电源输入、显示器输出、数据上行
  • Dock 类型设备需要支持双显示器
  • 电源输入功率足够使用,60W 起
  • 有 SD/TF 卡槽更佳
  • 不喜欢硬连接到 MBP 上的设备,偏好使用数据线连接的扩展坞

当然因为所有扩展坞针对的场景不一样,会对设备能支持的能力有所取舍,例如对于 Dock 类型的扩展坞,会更多要求全面的功能支持,但是对于便携类型的扩展坞,则是根据自己的实际使用场景去选择必需的功能,以及可选的功能。

目标产品

在参考同事的意见,阅读网上的评测,以及实际对比各种扩展坞的功能之后,最终陆续购买了以下几款扩展坞:

  • CalDigit TS3 Plus
  • Startech TB3DOCK2DPPD
  • 绿联 Type-C 八合一扩展坞 CM121
  • 威迅 Type-C 五合一扩展坞

参数对比

功能/型号 CalDigit Startech 绿联 威迅
类型 Dock Dock 便携 便携
连接类型 雷电3 雷电3 USB-C USB-C
PD 供电 85W 85W 65W 100W
双显 Yes Yes No No
视频接口 USB-C + DP USB-C + DP HDMI HDMI
4K60Hz Yes Yes No Yes
USB-A 5 5 3 个 3 个
USB-C 3 2 No No
读卡器 UHS-II SD UHS-I SD SD / TF No
以太网 Yes Yes Yes No
音频 Yes Yes No No
推荐指数 ★★★★★ ★★★★☆ ★★★★ ★★★★
官方价格 1870 500-700 239 228

CalDigit TS3 Plus

caldigit-ts3plus

购买链接:

一句话,对于不差钱的 MacBook Pro 用户来说,CalDigit TS3 Plus 应该是市面上可以买到的 Thunderbolt Dock 中功能和接口最强的一款了。

CalDigit TS3 Plus 是我用过几款 Thunderbolt Dock 中,提供的接口数最多的一款 Dock,并且提供 UHS-II 级别的 SD 读卡器,对于现在拍照使用 RAW 记录,需要导入的文件体积越来越大,这个提升的速度还是很有用的(虽然我还是在用 UHS-I 级别的 SD 卡,UHS-II 的卡实在太贵了 😔)。

另外 CalDigit TS3 Plus 也提供了 85W 的电源输入,虽然对于 MacBook Pro 16-inch 来说,官方标配的充电器已经是 96W,但是在绝大数场景下,85W 的电源输入已经足够用了,如果整机电量消耗超过这个范围,还可以用电池先顶上。

image-20200606132636368

对于显示器来说,可以直接通过 DisplayPort 连接,也可以通过 USB-C 转 DisplayPort 的线来连接,均可以达到 4K60Hz。理论上通过其中一个支持雷电 3 串联的 USB-C 口来连接显示器,也可以驱动 5K 显示器,当然这个我并没有条件去测试了。

image-20200606133653236

优点

  • 接口齐全,音频、以太网、USB-C、USB-A 均配备
  • UHS-II SD 读卡器,可以达到更高的存储卡读取速度
  • 除了 5 个 USB-A 接口和 1 个 Thunderbolt 3 串联接口外,还额外提供了 2 个 USB-C 的数据接口

缺点

  • 贵(当然这是我的缺点)

Startech TB3DOCK2DPPD

startech-tb3dock2dppd

购买链接:

  • 没有链接,上闲鱼搜索 Startech 仔细挑选

在使用 2015 款 MacBook Pro 的时候,我就已经购买过 Startech 家的 Thunderbolt 2 Dock,虽然因为雷电 2 协议的最高速率只能达到 20Gbps,并不能通过一根线同时驱动两台 4K 显示器,也不能提供电源输入,但是对于同时连接多个 USB-A 设备,例如鼠标、键盘等,还是很方便的。

因此在公司里也配备了两台 4K 显示器之后,我也在寻找 CalDigit TS3 Plus 的替代品,毕竟同时买两个 CalDigit TS3 Plus 也不太经济。

在闲鱼搜索了一番 Startech 之后,又发现了好几款洋垃圾,最后选择了 Startech TB3DOCK2DPPD 这个型号,主要原因就是它相比其他几款闲鱼上有卖的 Startech 扩展坞,这一款具备 85W 电源输入的能力。

同样的是雷电 3 的 Dock 设备,就不单独截图了(主要是设备不在手边)。

优点

  • 便宜,价格是 CalDigit TS3 Plus 价格的零头
  • 接口齐全,SD 读卡器、以太网、音频、双显示器均支持

缺点

  • 应该都是洋垃圾,闲鱼上的成色都不算好,介意成色的不建议购买
  • 只有一个 USB-C 数据口,在接了双显示器之后,就不能再连接 USB-C 接口的设备

绿联 Type-C 八合一扩展坞 CM121

ugreen-cm121

购买链接:

CalDigit TS3 Plus 和 Startech TB3DOCK2DPPD 虽然接口齐全,功能强大,但是并不方便移动,在带着笔记本回家或者出门的时候,同样有去外接显示器或者是读取 SD 卡的需求,这个时候就需要购买一个更便携的 USB-C 扩展坞了。

绿联 CM121 这个扩展坞本身不具备 4K60Hz 的视频输出能力,因此如果想要在 4K 显示器上达到 60Hz 的刷新频率,只能选择非 HiDPI 模式,分辨率设置到 2560×1440,这样可以达到 59Hz 的刷新率。

image-20200607082104636

但是使用 macOS 自身的设置来设置这个分辨率可能并不方便,需要借助于 SwitchResX 这个 App 来设置显示器的分辨率为非 HiDPI 模式:

image-20200607082212386

使用 4K 显示器时,HiDPI 和非 HiDPI 在稍微远一点的距离观察,可能感受并不会特别明显,当然这个因人而异。

如果采用这个类型的便携扩展坞,又对屏幕刷新率比较敏感的话,可以选择这种方式去设置。

连接到 MacBook Pro 之后,可以看到扩展出来 4 口 USB 3.0 Hub、USB 3.0 读卡器以及千兆以太网:

image-20200606153353404

写入基本在 100~200 MB/s 中波动,读取速度比较稳定,基本在 400MB/s 左右:

image-20200606154154940

优点

  • 接口齐全,多达 8 个外部接口,除了不支持上古时代的 VGA 接口,其他平时可以用到的接口都齐全了
  • SD 读卡器和 TF 读卡器,可以同时使用

缺点

  • 不支持 4K60Hz 视频输出
  • 电源输入最高 65W

威迅 Type-C 五合一扩展坞

vention-type-c

购买链接:

知道这个牌子的扩展坞,是因为最近入手了一台联想小新 Pro 13,它没有雷电 3 接口,因此需要一个通过 USB-C 连接,但是能输出 4K60Hz 视频信号的扩展坞设备,在论坛上看帖子的时候刚好看到威迅推出了具备 4K60Hz 输出能力的这款扩展坞。

实测通过 HDMI 连接 AOC 2790PC,可以达到 4K60Hz 分辨率和刷新率,但是达到这个分辨率和刷新率对于电脑的要求应该是跟苹果新款 USB-C 数字影音多端口转换器 的要求是一样的,主要就是需要独立显卡,以及 USB-C 接口可以以 DisplayPort 1.4 进行视频信号输出。

通过 MacBook Pro 16-inch 的 USB-C 口连接显示器,可以看到连接类型为 DVI or HDMI,并且输出分辨率为 4K60Hz :

image-20200606140238092

当然视频输出达到 4K60Hz 并不是唯一目的,选择这款扩展坞的还有一个原因就是,它在视频器输出达到 4K60Hz 的同时,可以提供 5Gbps 的数据连接,这样可以通过这个扩展坞,就可以同时使用 4K 显示器,以及高速 USB 外接设备,例如 SSD 移动硬盘等。

image-20200606141927364

上图可以看到通过威迅扩展坞连接绿联 USB 3.0 SATA 硬盘盒,连接速度为 5Gbps。

实测读写速度:

image-20200606141940295

读取速度基本可以稳定在 400MB/s 左右,写入速度可能根据 SSD 缓存使用情况,会在 100~200 MB/s 中间波动。

在电源输入方面,威迅扩展坞,在连接紫米 65W PD 充电头时,可以达到 55W 充电功率(这个可能跟我用的充电线是 60W 有关系),在连接原厂 96W 充电器的情况下,可以达到 89W 充电功率,这个是可以满足大多数情况的需要了,输入功率的大小主要还是取决于所使用的充电器是什么。

image-20200606135453562image-20200606135505812

优点

  • 在支持 DP1.4 视频信号输出的设备上,可以同时实现 4K60Hz 和 5Gbps 数据连接
  • 电源输入标称值可以高达 100W,实测连接 96W 充电器可以到达 89W

缺点

  • 没有读卡器接口
  • 没有以太网接口

绿联五合一 HDMI 高清款

在写这篇文章的时候,又在绿联旗舰店发现他们也出了一款支持 4K60Hz 的扩展坞,接口与威迅的完全一样,但是价格要比威迅低不少,为 169 元。

购买链接:

总结

总的来说,现在 USB-C 口的流行,以及雷电 3 的普及,极大的方便了在固定地点办公时,有很多外部设备需要连接的情况,通常情况下,都可以通过一根线来解决问题。

虽然需要额外支出来购买一个扩展坞设备,但是我觉得这还是值得的,毕竟在雷电 2 时代,还只能享受到一根线解决多个外部设备的连接问题,但并不能同时解决电源输入问题。

以上介绍的几款 USB Type-C 扩展坞,各有特点,并不存在哪一款最好的情况,实际购买时,还是需要根据自己的需求情况去选择。比如我选择的扩展坞都是使用 HDMI 或者 DisplayPort 去连接显示器的,如果有 VGA 连接需求,那么就需要考虑另外的型号了。

另外,固定地点使用,和移动便携使用,场景不同,对扩展坞的要求也不同,还是需要根据自己实际的场景,或者经常需要使用扩展坞的场景,去挑选更合适的扩展坞。

现在 USB Type-C 接口越来越普及,相信再过一段时间,会有更多物美价廉,功能齐全的扩展坞出现。在浏览绿联旗舰店里的各种扩展坞时,可以看到一些很有意思的型号,像同时可以当底座以及扩展坞的产品。

好了,我买过用过的扩展坞就介绍到这里,希望能对大家有所帮助。

购买链接

CalDigit TS3 Plus

绿联八合一扩展坞 CM121

威迅五合一扩展坞

绿联五合一 HDMI 高清款

相关链接

基于钉钉 + Virtual-LDAP + KeyCloak 的内网统一认证系统

0. 架构

基于钉钉的内网统一认证

1. 背景

最近公司内网的各种系统部署得越来越多,每个系统都有自己的认证方式和账号体系,这导致大家在每个地方都要去注册一个账号,并且不利于公司统一管理密码安全策略,例如密码到期策略、密码复杂度策略以及强制二次验证等。

以及对于一部分短平快的内网应用来说,我们并没有时间去为它开发一套用户体系,这个时候还是希望能有一个统一的前端反向代理来处理用户认证这个流程。

为此,我就去寻找了一些解决方案,并且为了解决开源系统并不能对接外部用户系统的问题,开发了一个 Node.JS Package(Virtual-LDAP)来提供 LDAP 能力。

2. 问题

虽然总的需求是一个很简单的功能,但是这其中还是有很多细节的问题需要考虑。

认证方式

对于有一些开源系统,它本身是支持 OAuth 来进行用户认证的,这个时候只需要去选择一个支持 OAuth 的用户管理系统就可以了,甚至基于开源库自己去开发一个也并不困难。但是对于某一些开源系统来说,它并没有提供 OAuth 认证接入的支持,只提供了 LDAP 接入。

例如最近我们引入了 Metabase 作为面向运营的快速 BI 分析工具,但是它除了可以接入 Google 账号作为认证方式,就只能接受 LDAP 作为认证方式了。这个时候就得去寻找一个认证系统,同时能支持 OAuth 以及 LDAP。

用户体系

引入用户管理系统之后,还有另外一个问题需要考虑,就是现在员工的用户体系需要去管理。对于一个小公司来说,目前并没有一个统一的工具去同时管理员工的各种信息以及状态。

但是目前公司已经引入钉钉作为公司的交流沟通工具,以及作为各种流程的审批处理系统,HR 也会在钉钉上去管理所有员工的状态,以及员工的组织架构。

因此,这个用户管理系统最好需要能支持同步钉钉中的用户体系,这样就不需要额外的人力去维护用户管理系统,以及在有员工状态变更的时候,能及时同步,避免出现授权外的访问。

数据同步

有了 OAuth,有了 LDAP,还有了钉钉这个数据源,因此就需要处理好各个 Provider 之间的数据同步问题,避免人工去维护各个系统里面的用户数据,做到以钉钉的数据为基础,用户管理系统提供能力,做到各个系统各个认证方式得到的用户数据都是一致的。

以及,对于 LDAP 来说,它是有组织架构的概念的,这个可以在对接到它的应用系统中,快速映射到应用中的用户组,实现用户的权限自动分配和管理,避免每次有新员工加入,都需要单独去配置一次各个业务系统的权限。因此,这也要求用户管理系统能够做到同步钉钉的组织架构,无需额外管理。

3. 解决方案

KeyCloak

KeyCloak Admin Console

KeyCloak 是一个开源软件产品,旨在为现代的应用程序和服务,提供包含身份管理和访问管理功能的单点登录工具。

KeyCloak 提供了丰富的功能用于公司内部单点登录上,包括:

  • 内置的用户账号管理界面
  • OpenID Connect 以及 OAuth 2.0 支持
  • LDAP 同步支持
  • 支持自定义主题

虽然之前也找到了 FreeIPA 这个开源系统,功能也同样强大,但是在部署过程中碰到了很多问题,最后还是选择了 KeyCloak。

Pomerium

Pomerium

对于大多数开源系统来说,可能都已经内置了对于 OAuth 或者 LDAP 的支持,对于这些系统,只需要按它的需求,去配置 OAuth 或者 LDAP 认证即可接入 KeyCloak。

但是对于一些静态页面,或者是自行开发的内部应用,可能并没有时间去额外添加用户认证支持,而这个需要就需要一个带用户认证支持的反向代理了。

Pomerium 就是这样一个反向代理应用,它作为一个 Identity-Aware Proxy,用于给内部应用增加安全访问的能力。

Pomerium 的主要功能有:

  • 支持接入 OAuth 认证
  • 支持配置内部应用允许哪些域,或者哪些用户可以访问
  • 支持 WebSocket 转发
  • 支持转发时自定义 HTTP Header
  • 支持 JWT 或 HTTP Header 传递用户 Session 信息到后端内部应用
  • 提供一个隐式 domain/.pomerium 路径来显示当前用户信息
  • 支持使用 Wildcard SSL 证书给后端服务统一增加 SSL 支持

通过 Pomerium,就可以将内部不带用户认证的应用直接加上用户认证的能力,避免非授权访问,并且可以直接通过 JWT 传递过来的用户信息,进行额外的用户权限管理。

Virtual-LDAP

Virtual-LDAP 是我开发的一个 Node.JS 程序包,用于使用自定义数据源来提供一个 LDAP 服务,可以将非 LDAP 用户系统(目前支持钉钉)对接到只支持 LDAP 认证的系统当中。并且支持保存用户密码到数据库中,以使用与非 LDAP 用户系统不一样的密码数据。

Virtual-LDAP 主要功能有:

  • 定时同步钉钉组织架构以及员工信息
  • 提供基本 LDAP 功能,包括 bind、search、modify 等操作
  • 通过配置文件配置管理账号
  • 独立保存用户密码,以 SHA256+Salt 存储
  • 支持自定义分组能力,在钉钉组织架构之外扩展用户分组
  • 支持自定义用户数据 Provider,可以自行开发接入钉钉以外的用户系统

Virtual-LDAP 主要解决的问题是市面上的 LDAP 服务系统并不支持接入钉钉用户系统,钉钉也并没有提供一个 LDAP 方式的数据源供企业内部使用,因此需要额外的系统去对接钉钉的用户系统,以 LDAP 方式提供用户数据,供 KeyCloak 及其他内部系统使用。

当然,Virtual-LDAP 并不是一个全功能的 LDAP 服务器,它仅支持有限的 LDAP 操作,但是在对接到 KeyCloak 作为 User Federation 已经足够用了,以下功能都可以正常使用:

  • User Synchronize
  • Group Synchronize
  • User 和 Group 的映射关系,以及完整的组织架构
  • 在认证时,使用 LDAP bind 进行认证
  • 修改密码时,使用 LDAP modify 同步保存密码

通过 Virtual-LDAP,就可以直接由 HR 去管理公司的员工以及组织架构,并且不需要额外再去另外一个系统中同步维护相关信息,Virtual-LDAP 会使用钉钉 OpenAPI 自动从钉钉获取最新的员工列表以及组织架构信息。

4. 部署

对于 KeyCloak 和 Pomerium 来说,官方均已提供 Docker 镜像,因此直接通过 Docker 即可以快速部署使用。

  • KeyCloak Docker:https://hub.docker.com/r/jboss/keycloak
  • Pomerium Docker:https://hub.docker.com/r/pomerium/pomerium

对于 Virtual-LDAP 来说,可以直接从源代码运行,也可以自己编写一个 Dockerfile 来使用 Docker 部署。

一个典型的 Virtual-LDAP Dockerfile 可以像下面这样:

Dockerfile

FROM node:13.7.0-alpine

WORKDIR /app
COPY package.json /app/
RUN npm install

COPY index.js /app/
COPY config.js /app/

CMD [ "node","index.js" ]

index.js

const server = require('virtual-ldap');

server.setupVirtualLDAPServer(require("./config"));
server.runVirtualLDAPServer();

package.json

{
"dependencies": {
"virtual-ldap": "^0.1.1"
}
}

当然,必需的配置文件 config.js 也是不可少的,具体如何配置可以参考 config.sample.js

5. 小结

总的来说,如果有额外的人力去维护两份员工信息以及组织架构,只需要 KeyCloak 就可以解决以上很多问题。但是对于小公司来说,使用额外的人力总归不是很高效的方式,并且钉钉拥有更完整的用户系统管理功能,对于 HR 来说使用上可能也更为友好。

希望 Virtual-LDAP 能给同样希望在公司内部部署统一认证系统,以及使用钉钉作为企业交流沟通的朋友们有所帮助。

6. 参考

—EOF—

另外一些胶片

对一个宅来说,热情果然很容易消退,胶卷的消耗速度是越来越慢。

再一次,胶片摄影

Nikon FE

也不能叫摄影,就是拍拍照。

数码相机还没有玩明白呢,不知道为什么突然想玩胶片了。

上一次用胶片,已经记不得是什么时候了,用的应该是国产的傻瓜机,拍一卷的成本也特别高。

后来了解了一下现在的胶片相机,找到一个佳能 EOS 10 QD,成色特别好的竟然也很便宜,配上朋友送的 50/1.8,入门无压力。

EOS 10 QD

到手之后,装上胶卷,切换到 A 档,半按快门自动对焦,自动测光,按下快门自动过片,使用起来跟数码相机并没有太多区别。

除了对焦点少一点,和不能马上回放。

一开始总觉得,每按一次快门,都是有成本的,所以特别珍惜,虽然一卷只有 36 张,还是用了很久的时间才拍完。

拍完之后,赶紧上淘宝找冲洗的店家,赶紧打包,赶紧叫来快递,把胶卷寄出去。

在等待店家把冲洗扫描后的照片传回的时候,就跟感觉在等待彩票开奖一样,有没有对上焦?快门准不准?胶卷装得对不对?

幸好自动的机器还是挺保险的,收到照片时,36 张还是 36 张,除了有些对焦点选错了,基本上都还能看。

虽然富士 SP3000 扫描评价很低,但是还是想感受一下,这个胶卷配上这个扫描仪,是个什么感觉。

Ants

Starbucks

生日花牌

Lotus

荷花池

既然能出片了,就想着试试其他的,总觉得如果一直用自动的机器,为什么不直接用数码相机呢。

在看了很多年代更久远一点的相机之后,对那种金属质感难以释怀。看了很多文章之后,对比了一下,最终选择了这款:

Nikon FE

Nikon FE,手动对焦,带光圈优先模式,最高快门速度 1/1000 秒,磨砂裂象对焦。

至于结果嘛,就只能等下一次开奖咯。

Garmin vivosmart 4 使用体验

Garmin vivosmart 4

缘由

在去年秋天,我突然觉得不能继续放肆下去,需要对体能和体形进行更好的改善,刚好公司的健身房也算是设施完善,因此首先就开始了通过有氧来进行减脂的训练。

作为一个器材党、数据党,在运动的时候怎么能没有一个设备来记录训练数据呢,不管是运动的时长、距离,还是心率的波动,都是我需要关注的。

经验

在为自己购买智能手环或手表设备之前,我已经给家里人买过几款智能手环以及试用过几款智能手环或手表:

  • 荣耀手环 4
  • 米动手表青春版
  • 米动手环
  • Amazfit 智能运动手表 2S

作为一个戴配饰会死星人,我完全不能接受特别大特别重的智能手表类设备,特别是作为一个码农,在敲键盘的时候还有一个手表来哐当哐当敲着键盘托的位置,简直难以忍受。

在试用了 Amazfit 智能运动手表 2S 之后,就直接放弃了使用手表类设备的念头。秋天已经穿上长袖甚至外套,一个又厚又宽大的手表简直是穿衣脱衣的巨大障碍。

在试用了米动手环之后,发现那个屏幕的表现实在是有些差劲,颗粒感太明显,放弃。

米动手表青春版其实感受还不错,反显常亮表盘,日常使用足够,续航足够长,还带 GPS,并且本身重量体积很轻很薄,但是在使用过小米运动这个 App 之后,完全没有想要使用的想法。

荣耀手环的屏幕很惊艳,几乎没有颗粒感,但是华为运动健康 App 也是跟小米运动一样,在运动数据记录方面不够专业。

并且在使用过程中,不管是小米运动,还是华为运动健康,甚至于苹果的 Health App,都没有能提供一个运动记录的详细数据,以及提供一个除了手机之外更方便查看运动记录的 Web 或者桌面 App。

选择

作为一个 Garmin 老用户,这个时候自然会想到在运动设备领域足够专业的 Garmin 有没有提供什么设备可供选择。

在选择设备的时候,有几个功能点是我需要考虑的:

  • 续航能力
  • 是否支持 GPS
  • 是否支持全天心率监测
  • 是否防水
  • 是否支持游泳或力量训练
  • 佩戴是否舒适

在 Garmin 的运动休闲分类中挑了好久之后,找到三个备选:

  • vivosmart 4:7 天续航,无 GPS,带血氧监测,大号重 21.5g
  • vivosport:7 天续航,有 GPS,大号重 27g
  • vivoactive HR:8 天续航,有 GPS,重 47.6g

这几个设备续航都不错,并且都有全天心率监测,都有防水能力。

在纠结于 vivosport 和 vivosmart 4 的最后,考虑到多数时候可能并不需要 GPS 功能,在开启 GPS 的时候续航都不会太长,并且 vivosmart 4 发布更晚,买新不买旧,入手 vivosmart 4。

至于 vivoactive HR,手表造型 + 太重还是放弃了,但是屏幕比较并且是方形的比较符合我的口味,还是在闲鱼入手了一个备用在需要使用 GPS 的场合。

佩戴

在 vivosmart 4 到手之后,佩戴的前几天没有找到合适带扣位置,适应了几天,在找到合适的位置之后,还是比较舒适和方便的。

并且 vivosmart 4 的体积和重量都比较小,在睡觉的时候并不会特别感受到手腕上有一个手环佩戴,相比之前戴着 vivoactive HR 睡觉的时候感受要好很多,佩戴 vivoactive HR 睡觉的时候总感觉有一个东西很硌手。

续航

在开启全天心率监测 + 睡眠血氧监测 + 每天运动一小时,vivosmart 4 差不多还能有 4 天左右的续航,相当满意了。

并且 vivosmart 4 的充电器是一个弹簧充电夹,不像 vivoactive HR 是个硬质充电夹,很方便就可以夹上充电,2 小时即可充满电,完全可以在回家休息的间隔将电充满。

Garmin Connect

Garmin Connect

在最初列出备选的时候,就是因为很久以前已经用过 Garmin 310XT,对 Garmin 设备所能记录的数据,和 Garmin Connect 上所能展现的数据详实程度感到相当满意,这才是一个专业运动设备厂商应该提供的功能。

同时在试用了 Garmin Connect Mobile 之后,对小米运动、华为运动健康这些一不提供 Web界面、二不能导出数据、三竟然应用里还有广告的 App 简直难以忍受。

Garmin Connect 可以算是一个纯粹的运动设备 App 了,所有界面都是针对健康数据、运动数据,各种运动记录里面的数据、曲线都很详实,这样在我使用这个 App 的时候,可以给我一种我很专业的感觉 🙈。

同样,vivosmart 4 作为一个使用 BLE 的设备,同步数据需要使用 Garmin Connect Mobile + 手机蓝牙来将手环中的数据同步到服务器,如果不是经常打开 App 的话,可能会导致时间太久之后数据丢失,这不得不让我怀念 Garmin 310XT 使用 ANT+ 同步数据,只需要有一台常开的电脑加上 ANT+ Stick 就可以实现回到家自动同步数据了。

但是为了体积、重量、续航这些因素,也只能接受这个缺点了。

全天监测

vivosmart 4 支持全天心率监测,并且也支持异常心率提醒,可以设定在没有运动的时候心率超过某个值通过震动来发出提醒。当然我觉得全天心率监测并没有什么很大的用途,只是偶尔可以回顾一下一天的心率波动范围。

另外这个手环还支持睡眠监测,通过设定大概的入睡时间和醒来时间,手环可以自动记录这段时间中的睡眠质量。

入睡和醒来时间的设定并不意味着只能记录那两个点之间的数据,而是通过这个范围来确定睡眠时间的范围,只有在这个范围内的才能生成睡眠质量报告。这也就意味着它并没有办法记录像午睡这样的小憩类型的睡眠数据。

在对比过 vivosmart 4 和 Withings Aura Sleep Monitor 的数据之后,发现 vivosmart 4 的监测数据应该还行,可以作为自我睡眠质量的一个相对参考。

另外 Garmin 还在这类手环中搞出一个 Body Battery 的概念,通过监测睡眠和运动数据,计算出身体能量的增长和消耗,得出一个当前的电量值,可以一定程度上反应当前身体是否疲劳。

当然这只是一个参考值,权当娱乐就好,不用太在意。

Body Battery

力量训练

在之前挑选手环的对比过程中,发现了 vivosmart 4 支持力量训练模式,这个对于已经预期准备在有氧之后加上力量训练的我,还是非常有用的。

vivosmart 4 可以根据内置传感器来自动判断当前力量训练的动作是什么,例如深蹲、卧推等动作都还算能比较准确的识别出来,并且可以自动记录次数。

另外一个比较方便的一点,就是力量训练模式的分组功能,在每结束一组训练之后,可以显示休息时间,这样可以很方便的控制每组动作之间的休息间隔。

对于训练中的心率监测、心率提醒等功能,也算是基本能力了。

虽然 vivosmart 4 本身对于力量训练提供自动分组功能,可以不需要手动操作自动根据传感器判断当前是否进行下一个动作,但是在使用过期中发现,这个识别可能不是很精确,或者说我的动作不够精确,导致经常会出现识别错误,因此在使用过程中还是主要使用手动分组。

力量训练

MoveIQ

现在 Garmin 新款的手环或者手表,都支持 MoveIQ 功能,可以在不开启运动模式的情况下,自动识别当前的运动,例如步行跑步等。

这个功能吧,说有用也有点用,比如偶尔出门步行,但是并不会记着要在手环上开启步行模式,在连续步行超过 10 分钟之后,它就会自动打开步行运动模式,并且在停止运动之后,自动生成一条运动记录。像步行也可以根据步长估计出步行的距离,以及记录运动过程中的心率变化,配速等信息。

但是偶尔它的识别也是有问题的,可能已经运动很久了,也识别不出来,另外这种并不是计划中的运动,有没有记录可能问题也不是特别大。

只能说这是一个锦上添花的功能。

软件 BUG

在使用 vivosmart 4 过程中,偶尔还是会碰到固件出现 bug 的情况,比较常见的一个问题就是在开始训练时,如果开启了心率提醒,并且操作比较快,有一定概率会出现卡死在时间界面,按任何键都只会循环当前界面,无法开始,也无法结束,这个时候只能将它接到充电器上,开始充电时,感觉它应该是做了一个重启的操作,这个时候就可以正常使用了。

怎么说呢,很多时候我只能尽量等它的提示动画走完了再双击开始,避免触发这个 bug。

尽管在网上论坛里看到了说 Garmin 软件质量比较差,但是我觉得就我碰到的情况来说,应该还算是能接受的,毕竟我不是重度用户。

结论

就目前已经使用了半年的体验来看,我觉得 Garmin vivosmart 4 还是能比较满足我的各种需求,Garmin 的软件虽然评价不高但是足够专业,这个手环常用的电话、短信、通知提醒功能也都不缺少,Garmin Connect Mobile 又足够清晰好用。

如果你也是一个器材党、数据党,如果你也准备开始运动,可以考虑去 Garmin 专卖店试用一下。

购买链接

佳明天猫官方旗舰店:https://s.click.taobao.com/IA9ECBw (此链接带返利,如介意可自行搜索)

阿里云 IoT LinkDevelop 案例实战

阿里云 IoT 在 3 月份的时候发布了 Link Develop 一站式开发平台,我根据平台的文档,编写了几个示例,便于外部开发者们来快速理解和掌握怎样使用 Link Develop 平台去加速和辅助物联网产品的开发工作。

示例包括空气监测站、智能灯、Home Assistant 设备接入等,涉及的技术包括 Arduino、React、iOS、前端开发等。

通过这个文档,可以快速了解 Link Develop 一站式开发平台所提供的功能,以及怎样基于平台实现一个物联网产品。

文档配套示例代码同样提供在 GitHub 中。

目录:

GitHub 地址:

https://github.com/aliyun-linkdevelop/linkdevelop-practice

https://github.com/aliyun-linkdevelop/airmonitor_demo

https://github.com/aliyun-linkdevelop/smartlight_demo

玩玩智能家居8:搭建基于 Grafana 的环境数据看板

在之前的文章 《玩玩智能家居4:InfluxDB & Grafana》 已经介绍了怎么将 Domoticz 中采集到的数据存储到 Influxdb,以及使用 Grafana 来查看数据,但是这样只有一个两个数据,并不能很方便的对整个家里的环境数据有个快速了解。

Grafana 提供了丰富的面板组件,可以以各种形式来展示数据,例如文本和曲线图,而且也可以很方便地自定义阈值,对于数据的不同数值显示不同的颜色,或者不同的背景颜色,这样便于了解当前数据是否处于能接受的范围内。

借助于 Grafana 这些组件,就可以很方便的搭建一个属于自己的家庭环境数据看板了。

继续阅读 »

玩玩智能家居7:Domoticz 中的 Events

在使用 Domoticz 的过程中,为了避免让 Domoticz 只是成为一个手机上的遥控器,就需要根据生活使用场景去定制一些自动化的规则,例如在天黑回家时自动打开灯,又或者是在睡觉之后自动关闭不必要的灯,在这个时候,就需要使用 Domoticz 的 Events 系统了。

Domoticz 的 Events 支持很多种类语言的编码,其中还包括图形化的配置工具 Blockly。

当然这里并不会去介绍 Blockly 的配置方式,因为使用编码的方式可以得到更细粒度的控制,以及更自由的场景条件控制。

这里主要介绍一些处理事件时的技巧和思路。

时间差处理

在事件处理过程中,最重要的一件事就是判断事件发生的时间与当前时间的时间差,通过这个时间差,可以很方便的根据不同的时间差来达到不同的目的。

now = os.date('*t')

function timedifference (s)
  year = string.sub(s, 1, 4)
  month = string.sub(s, 6, 7)
  day = string.sub(s, 9, 10)
  hour = string.sub(s, 12, 13)
  minutes = string.sub(s, 15, 16)
  seconds = string.sub(s, 18, 19)
  t1 = os.time()
  t2 = os.time{year=year, month=month, day=day, hour=hour, min=minutes, sec=seconds}
  difference = os.difftime (t1, t2)
  return difference
end

直接使用 timedifference(otherdevices_lastupdate['设备名称']) 就可以得到当前距离这个设备状态最后变化的时间了。

继续阅读 »

玩玩智能家居6:接入杜亚电动窗帘

之前还没有玩上 Domoticz 的时候,家里全套系统都是用的 Broadlink,在买窗帘的时候也想着要买电动的,因此很自然的买了支持 Broadlink 的杜亚窗帘电机,可以方便地与 Broadlink 的传感器进行联动。

后来用了 Domoticz,但是 Broadlink 的系统并没有开放 API,想要接入 Domotiz 系统就比较麻烦了。在网上看了一堆帖子之后,发现可以通过分析窗帘电机遥控器信号,然后自己使用 433M 射频模块来自己控制。

Controlling Blinds.com RF Dooya Motors with Arduino and Vera 这篇帖子中提供了一个 PDF,详细介绍了如何嗅探信号,以及杜亚窗帘电机遥控器信号的格式。

准备材料

发射和接收 433M 射频信号需要的材料很简单,只需要 433M 发送和接收模块就可以了,不超过 5 块钱。

再加上需要接入 Domoticz,加个 NodeMCU,完事。

嗅探信号

首先需要嗅探一下窗帘遥控器发出的信号,如果有专业的机器的话可以直接去嗅探 433M 射频信号,如果没有的话,也可以使用 433M 模块自制一个。

根据前面提到的 PDF 中介绍的方法,将一个 433M 模块与 3.5mm 耳机线连接,然后插在电脑上。

因为 MacBook Pro 没有自带专用麦克风插孔,因此还得去买一个 USB 转耳机接口模块,方便接入。另外为了给 433M 模块供电,直接把模块的 VCC 跟 GND 跟 NodeMCU 的 VIN 和 GND 在面包板上连接起来了。

接着就可以使用 Audacity 进行录音操作了:

找到有规律的波形之后放大,开始数格子:

数完格子就知道一个遥控器指令的格式了。

指令格式

一个完整杜亚窗帘遥控器指令是 32 位 + 16 位或 8 位命令位,前 32 位可能包含了窗帘 ID 信息,不过我并没有仔细研究,每个遥控器的都不太一样,也不用太纠结。

例如一个打开窗帘的指令可以像下面这样:

10111101010000011001101101100001 00010001 00011110

每个指令需要发送 6 遍,在发送指令之前,还有一个间隙指令,需要发送三遍。

其实理论上,杜亚窗帘电机使用固定码,并不需要知道指令格式是什么意义,只需要按采集到的波形原样重放就可以了。

发射信号

有了波形,有了指令,就很方便的去重放射频信号了,反正也没什么加密措施,窗帘电机是不认识是由遥控器发出的指令,还是由 433M 模块发出的指令。

把 433M 射频发射模块与一个 NodeMCU 相连,然后使用之前帖子里提供的 BlindsVera.ino 中的代码就可以发射信号了。天线可以简单的使用一根 16cm 左右的导线。

BlindsVera.ino 中的代码都有注释,下面说说关键的几部分。

定义发送管脚,以及指令 1 和 0 所占用的时间

#define SEND_DATA 3 //Data pin for RF Transmitter
#define ZERO_HIGH 395 //Delay for the high part of a 0 in microseconds
#define ZERO_LOW 687 //Delay for the low part of a 0 in microseconds
#define ONE_HIGH 750 //Delay for the high part of a 1 in microseconds
#define ONE_LOW 333//Delay for the low part of a 1 in microseconds

指令中的标准位

unsigned char standardBits1 = 0b00000111;
unsigned char standardBits2 = 0b01110000;
unsigned char standardBits3 = 0b01010101;
unsigned char standardBits4 = 0b11001011;

BlindsVera.ino 中把窗帘 ID 与标准位分离了,但是在实际使用中,其实标准位并不统一,每个遥控器的都会不一致,因此在实际使用中需要把这里的标准位替换为实际的标准位,也就是数格子得到的指令中的前 28 位。

发送指令

void separatorDelay(boolean upDown);
void endDelay();
void blindAction(int c, int a);

最后就是发送指令了,根据之前采集的格式,按顺序发送相应的指令就可以了。

换个思路

杜亚窗帘电机上本身已经带了有线接口,可以直接使用 NodeMCU+继电器的方式来控制,不用去模拟射频信号,每个电机都是使用一样的线序,处理起来更简单一点。

更好的选择

呃,小米的窗帘电机?也许 miio 或者 python-mirobo 会支持吧,相对而言小米还是开放一些的。

参考资料

  1. Controlling Blinds.com RF Dooya Motors with Arduino and Vera
  2. 智能家居:窗帘篇

玩玩智能家居5:DIY水浸传感器

之前总是担心厨房水槽下水管会漏水,所以直接用雨水传感器做了一个水浸传感器,这样在漏水的时候,就可以直接收到通知,从而及时去检查并修复下水管漏水问题。

要 DIY 一个水浸传感器还是很简单的,只需要一个雨水传感器和一个 NodeMCU 就可以了。

雨水传感器

给 NodeMCU 刷上 ESPEasy,配置一个 Switch 设备,将 GPIO 设置为 NodeMCU 与雨水传感器 DO 针脚连接的 IO 就可以了。

然后再在 Domoticz 中配置好一个 Virtual Sensor,类型改为 Switch 就可以了。

报警声音

有些时候推送通知会比较慢,又或者手机不在身边,那么是否可以直接在 NodeMCU 这一端直接使用声音报警呢?这很简单,加个蜂鸣器模块,再写点代码就好了。

先给 ESPEasy 写个蜂鸣器插件,关键代码就是使用 Arduino 的 tone 函数了:

#define Plugin158_Do 262
#define Plugin158_Re 294
#define Plugin158_Mi 330
#define Plugin158_Fa 349
#define Plugin158_Sol 392
#define Plugin158_La 440
#define Plugin158_Si 494

static int Plugin158_TonesFreq[] = { Plugin158_Do, Plugin158_Re, Plugin158_Mi, Plugin158_Fa, Plugin158_Sol, Plugin158_La, Plugin158_Si };

static void Plugin158_PlayTones(int taskIndex) {
  int pin = Settings.TaskDevicePin1[taskIndex];

  char *tonesStr = "616161";

  pinMode(pin, OUTPUT);
  int len = strlen(tonesStr);
  if (Plugin158_TonesPlayingCharIndex < len) {
    char c = tonesStr[Plugin158_TonesPlayingCharIndex];
    int index = c - '0';
    if (index > 0 && index <= 7) {
      tone(pin, Plugin158_TonesFreq[index]);
    } else {
      noTone(pin);
    }
  }

  Plugin158_TonesPlayingCharIndex++;
  if (Plugin158_TonesPlayingCharIndex >= len) {
    Plugin158_TonesPlayingCharIndex = 0;
  }
}

为了能在有漏水时,马上报警,或者为了在没有网络情况不好时也能马上使用声音报警,需要在 ESPEasy 的本地规则里检测到漏水时来报警。

要实现这个功能,只需要使用 ESPEasy 的 Rules 功能,在 Rules 里检测到有漏水时,直接调用蜂鸣器插件进行报警:

on WATER#VAL=1 do
    buzzer,2,1
endon
on WATER#VAL=0 do
    buzzer,2,0
endon

更好的选择

当然,如果已经有小米网关了,可以直接购买 Aqara 水浸传感器,使用电池,方便部署,还美观 🙈。

而且小米的东西也可以不借助于 Domoticz 直接使用,可以将水浸传感器设置自动化,触发时直接使用小米网关播放警报音。

参考资料

  1. Domoticz
  2. Arduino – Tone