Shelly 是一家专注于智能家居领域的公司,提供智能插座、智能灯泡、智能开关等产品。该公司的产品具有可靠性高、易于使用和成本效益高等特点,深受用户喜爱。
据统计,Shelly 的智能家居产品在欧洲市场占有率较高,特别是在东欧市场,Shelly 产品的市场份额已经超过了 10%。Shelly 的产品也广泛应用于工业自动化领域,得到了众多企业的认可。
Shelly 的智能插座可以通过三方接入方式,与其他智能家居设备进行联动,从而实现更多的智能化场景。使用 Shelly 的智能插座,用户可以通过手机 APP 远程控制插座的开关状态,还可以设置定时开关、倒计时等功能,方便用户的生活。
除了智能插座,Shelly 还推出了智能灯泡、智能开关等多种产品,为用户提供全方位的智能家居解决方案。在智能家居市场中,Shelly 的产品备受关注,得到了广大用户的认可。
添加设备
想要深入了解Shelly的设备开放情况,首先的有设备。添加一个设备到自己的账号下,我这里用的是 plus-plug-s ,欧规的。


下面是一些相关的产品资料:
使用Shelly cloud app来配网

配网就是和普通的智能设备一样,先选择设备要添加的WiFi,输入密码,然后搜索设备的AP热点,这时候点击添加,手机会连上这个设备开的AP热点,APP与设备进行一些通信后,重连会有外网的路由器,这时候APP向服务器注册设备,完成整个添加流程。
这里有个问题:这个plug-s是有蓝牙的,不懂为什么配网不走蓝牙添加,交互体验会好很多,我也尝试了蓝牙添加,一直没有搜到设备。


配网完成后,可以在路由器的后台看到一个名为 shellyplug-s 开头的设备连接。


通过路由器后台可以看到,连接的是欧洲的谷歌云服务器,端口应该自定义的,不是mqtt的默认端口,协议方面没有抓包看,从控制端的协议来看,应该是websocket json格式。


APP 抓包查看控制和实时接收设备变化用的什么技术方案
控制,是直接发送HTTP请求去控制的


而实时状态,是通过websocket来同步的


个人云云对接到shelly
首先,先在网页版或者APP的个人设置里面获取个人的云端秘钥和服务器地址。记下备用。

构造HTTP请求,这里的`server_uri`和`auth_key` 就是刚才获取的秘钥和云端地址。需要注意的是`device_id`是在设备信息页面的十六进制的值,十进制的不管用。
获取设备状态:


控制设备开关:

实时状态变化可以通过websocket连接监听变化事件,这里使用的TOKEN,可以通过OAUTH授权获取,但是根据文档我获取一直失败。

这里我就直接使用APP抓包获取到的TOKEN进行连接了,也是可以使用的。实时状态和控制都可以通过websocket连接进行。

商务云云对接到shelly
公司云云对接Shelly,就是通过公司服务器,可以为多人提供控制Shelly设备,与个人使用的云对接方式基本没有区别。只是公司接入可能会涉及商务。
首先,需要与官方邮件联系,获取到itg和token,作为获取jwt的认证凭证。

然后在服务器(需要有公网IP,可以没有域名)上起一个http server,实现个post接口,比如拿python来快速实现一个。作为绑定完账号后的回调接口。示例代码:
使用检查下服务情况


构建绑定地址并访问,如 https://my.shelly.cloud/integrator.html?itg=TAG&cb=http://localhost:8999

如果账号下没有设备的话,绑定流程不算成功,显示如下

这个绑定页面实际上就是进行登录,然后获取设备列表,用户选择了设备之后,再进行一个同步。

账号下有设备页面如下,这时候就可以选择设备进行授权了,每个设备都可以单独给查看和控制权限。

当之前已经授权过一个设备时,在账号下再新增设备,不会自动同步到第三方,需要重新授权该设备。

绑定成功后会提示:

此时回调接口(回调地址需要是公网地址,不能是本机起的服务)会收到POST请求,请求里面会包含设备的名字。目前看在APP上改名字不会实时同步到三方接口这边,只有重新绑定时候才能更新。

接着就可以通过wss连接,连接到shelly的云服务器,实时监听和处理设备变化消息。连接wss示例(需要执行 npm i ws 安装下依赖库)。HOST 参数的值就是上面用户绑定并选设备时候请求到回调地址中带的。
连接成功如:

绑定完成之后websocket连接就可以收到设备相关消息

取消授权时候收到的回调请求

取消控制授权后发送控制消息返回

开关状态变化时候websocket收到的消息

正常放置状态下,状态也会不定时报上来。目前看间隔没有明显规律,但不会太频繁

控制设备时候的消息

在离线消息同步

Shelly 局域网访问设备页面

局域网可以多设置一些选项

配置mqtt连接,需要本地先起一个mqtt服务端,或者用其他公有的mqtt云,这里我本地用docker起了个emqx的服务端,然后再简单配置下连接mqtt的配置。


配置了mqtt连接后,可以看到,状态上报是30s间隔

上报的消息如下,topic表示了协议字段,payload为具体值。这时候设备和Shelly的云端连接是断开的,用APP不能控制设备。

在局域网下,能打开debug日志,方便提供给官方售后定位问题。


还能设置一些开关事件的HTTP调用,比如这里设置打开开关时候请求一个地址


设置AP漫游,当信号强度大于设定值时,优先连入该AP点

Shelly 网页版访问设备

Shelly APP 访问设备页面

📎 参考链接
- 作者:Yibin
- 链接:https://yibin.dev/article/8664e728-dd10-484d-b89b-0affa1238413
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。
相关文章








