MicroPython动手做(28)——物联网之Yeelight
<div class='showpostmsg'><p>Yeelight<br />是全球领先的智能照明品牌,2014年加入小米智能家居生态链,在物联网、智能交互、工业设计和灯光体验等方面不断打磨,持续定义照明行业的最高标准。Yeelight拥有完整的智能家居照明产品线,产品系列辐射家装照明、台上照明、氛围照明以及智能照明控制,全球累计出货1100余万件,用户辐射100多个国家和地区,致力于通过高品质光环境的打造,让更多人享受到智能照明的便捷和乐趣。</p>
<p> </p>
<p></p>
</div><script> var loginstr = '<div class="locked">查看本帖全部内容,请<a href="javascript:;" style="color:#e60000" class="loginf">登录</a>或者<a href="https://bbs.eeworld.com.cn/member.php?mod=register_eeworld.php&action=wechat" style="color:#e60000" target="_blank">注册</a></div>';
if(parseInt(discuz_uid)==0){
(function($){
var postHeight = getTextHeight(400);
$(".showpostmsg").html($(".showpostmsg").html());
$(".showpostmsg").after(loginstr);
$(".showpostmsg").css({height:postHeight,overflow:"hidden"});
})(jQuery);
} </script><script type="text/javascript">(function(d,c){var a=d.createElement("script"),m=d.getElementsByTagName("script"),eewurl="//counter.eeworld.com.cn/pv/count/";a.src=eewurl+c;m.parentNode.insertBefore(a,m)})(document,523)</script> <p>Yeelight发展历程</p>
<p> </p>
<p></p>
<p><strong>1、Yeelight智能照明设备</strong><br />
支持通过无线网络远程控制。当用户收到智能发光二极管设备第一次,他/她需要完成一个配置过程来向设备提供路由器的SSID和密码。这个过程通常被称为智能配置或快速连接。出于安全考虑,协议用于智能配置是专有的,这意味着没有第三方可以知道或使用它。但是,在设备连接到路由器后,它可以被下面的所有设备看到同样的网络,因此也可以由理解的第三方设备控制互操作控制协议。</p>
<p> </p>
<p>Yeelight智能设备是通过云来控制的。该命令将被发送到云,然后转发到设备。如图所示,所有的无线指示灯都与云服务器保持联系。如果云服务器关闭或广域网出现问题,用户将失去对的控制设备。因此,我们认为本地控制是非常必要的,并开始在本地工作控制机制。本地控制可以进一步分为两部分:发现过程和控制程序。对于本地发现,我们使用了类似SSDP的协议,但它被大大简化了。</p>
<p></p>
<p> </p>
<p><strong>2、Yeelight服务的发现过程</strong></p>
<p> </p>
<p></p>
<p><strong>3、快递刚送到的Yeelight灯泡</strong></p>
<p>准备尝试用MicroPython来控制它</p>
<p> </p>
<p></p>
<p>Yeelight灯泡</p>
<p> </p>
<p></p>
<p>基本参数</p>
<p> </p>
<p></p>
<p><strong>4、使用A\B按键来开关Yeelight灯泡</strong></p>
<p> </p>
<pre>
<code># MicroPython动手做(28)——物联网之Yeelight
#使用A\B按键来开关Yeelight灯泡
from mpython import *
import network
import time
from yeelight import *
my_wifi = wifi()
my_wifi.connectWiFi("zh", "zy1567")
def on_button_a_down(_):
global i
time.sleep_ms(10)
if button_a.value() == 1: return
rgb.fill((int(153), int(153), int(153)))
rgb.write()
time.sleep_ms(1)
time.sleep_ms(500)
LED.turn_on()
time.sleep_ms(500)
LED.set_rgb(255, 255, 255)
def on_button_b_down(_):
global i
time.sleep_ms(10)
if button_b.value() == 1: return
rgb.fill( (0, 0, 0) )
rgb.write()
time.sleep_ms(1)
time.sleep_ms(500)
LED.turn_off()
button_a.irq(trigger=Pin.IRQ_FALLING, handler=on_button_a_down)
button_b.irq(trigger=Pin.IRQ_FALLING, handler=on_button_b_down)
rgb = (int(51), int(51), int(255))
rgb.write()
time.sleep_ms(1)
if len(discover_bulbs()) > 0:
LED = Bulb(discover_bulbs()["ip"])</code></pre>
<p> </p>
<p> </p>
<p>实验场景</p>
<p> </p>
<p></p>
<p>mPyehon X 实验图形编程</p>
<p> </p>
<p></p>
<p><strong>5、AB键控制Yeelight灯泡升级版(绿色光)</strong></p>
<p> </p>
<pre>
<code># MicroPython动手做(28)——物联网之Yeelight
#AB键控制Yeelight灯泡升级版
from mpython import *
import network
import music
import time
from yeelight import *
my_wifi = wifi()
my_wifi.connectWiFi("zh", "zy1567")
def on_button_a_down(_):
global i
time.sleep_ms(10)
if button_a.value() == 1: return
music.play('F4:1')
time.sleep_ms(500)
LED.turn_on()
time.sleep_ms(500)
LED.set_rgb(153, 255, 153)
rgb.fill((int(0), int(102), int(0)))
rgb.write()
time.sleep_ms(1)
oled.fill(0)
oled.DispChar("打开电灯", 43, 22, 1)
oled.show()
def on_button_b_down(_):
global i
time.sleep_ms(10)
if button_b.value() == 1: return
music.play('D4:1')
time.sleep_ms(500)
LED.turn_off()
rgb.fill( (0, 0, 0) )
rgb.write()
time.sleep_ms(1)
oled.fill(0)
oled.DispChar("关闭电灯", 43, 22, 1)
oled.show()
button_a.irq(trigger=Pin.IRQ_FALLING, handler=on_button_a_down)
button_b.irq(trigger=Pin.IRQ_FALLING, handler=on_button_b_down)
music.play('A4:1')
rgb = (int(51), int(51), int(255))
rgb.write()
time.sleep_ms(1)
if len(discover_bulbs()) > 0:
LED = Bulb(discover_bulbs()["ip"])</code></pre>
<p> </p>
<p></p>
<p>mPyehon X 实验图形编程</p>
<p> </p>
<p></p>
<p><strong>6、自动变色循环流光灯</strong></p>
<p> </p>
<pre>
<code># MicroPython动手做(28)——物联网之Yeelight
#自动变色循环流光灯
from mpython import *
import network
import time
from yeelight import *
my_wifi = wifi()
my_wifi.connectWiFi("zh", "zy1567")
rgb = (int(0), int(102), int(0))
rgb.write()
time.sleep_ms(1)
while True:
if len(discover_bulbs()) > 0:
D = Bulb(discover_bulbs()["ip"])
time.sleep_ms(500)
D.turn_on()
time.sleep_ms(500)
D.set_rgb(32, 178, 170)
for i in range(10, 101, 5):
time.sleep_ms(500)
D.set_brightness(i)
time.sleep_ms(500)
D.set_hsv(359, i)
time.sleep_ms(500)
D.turn_off()</code></pre>
<p> </p>
<p>mPyehon X 实验图形编程</p>
<p> </p>
<p></p>
<p></p>
<p><strong>目录清单</strong><br />
MicroPython动手做(01)——春节后入手了一块K210芯片AI开发板 <br />
<a href="https://bbs.eeworld.com.cn/thread-1115786-1-1.html" target="_blank">https://bbs.eeworld.com.cn/thread-1115786-1-1.html</a></p>
<p>MicroPython动手做(02)——尝试搭建K210开发板的IDE环境<br />
<a href="https://bbs.eeworld.com.cn/thread-1115831-1-1.html" target="_blank">https://bbs.eeworld.com.cn/thread-1115831-1-1.html</a></p>
<p>MicroPython动手做(03)——零基础学MaixPy之开机运行<br />
<a href="https://bbs.eeworld.com.cn/thread-1116184-1-1.html" target="_blank">https://bbs.eeworld.com.cn/thread-1116184-1-1.html</a></p>
<p>MicroPython动手做(04)——零基础学MaixPy之基本示例<br />
<a href="https://bbs.eeworld.com.cn/thread-1116438-1-1.html" target="_blank">https://bbs.eeworld.com.cn/thread-1116438-1-1.html</a></p>
<p>MicroPython动手做(05)——零基础学MaixPy之LCD液晶屏<br />
<a href="https://bbs.eeworld.com.cn/thread-1116577-1-1.html" target="_blank">https://bbs.eeworld.com.cn/thread-1116577-1-1.html</a></p>
<p>MicroPython动手做(06)——零基础学MaixPy之单目摄像头<br />
<a href="https://bbs.eeworld.com.cn/thread-1116591-1-1.html" target="_blank">https://bbs.eeworld.com.cn/thread-1116591-1-1.html</a></p>
<p>MicroPython动手做(07)——零基础学MaixPy之机器视觉<br />
<a href="https://bbs.eeworld.com.cn/thread-1116617-1-1.html" target="_blank">https://bbs.eeworld.com.cn/thread-1116617-1-1.html</a></p>
<p>MicroPython动手做(08)——零基础学MaixPy之识别颜色 <br />
<a href="https://bbs.eeworld.com.cn/thread-1116662-1-1.html" target="_blank">https://bbs.eeworld.com.cn/thread-1116662-1-1.html</a></p>
<p>MicroPython动手做(09)——零基础学MaixPy之人脸识别<br />
<a href="https://bbs.eeworld.com.cn/thread-1116720-1-1.html" target="_blank">https://bbs.eeworld.com.cn/thread-1116720-1-1.html</a></p>
<p>MicroPython动手做(10)——零基础学MaixPy之神经网络KPU<br />
<a href="https://bbs.eeworld.com.cn/thread-1116925-1-1.html" target="_blank">https://bbs.eeworld.com.cn/thread-1116925-1-1.html</a></p>
<p>MicroPython动手做(11)——搭建掌控板IDE环境<br />
<a href="https://bbs.eeworld.com.cn/thread-1117964-1-1.html" target="_blank">https://bbs.eeworld.com.cn/thread-1117964-1-1.html</a></p>
<p>MicroPython动手做(12)——掌控板之Hello World<br />
<a href="https://bbs.eeworld.com.cn/thread-1118180-1-1.html" target="_blank">https://bbs.eeworld.com.cn/thread-1118180-1-1.html</a></p>
<p>MicroPython动手做(13)——掌控板之RGB三色灯 <br />
<a href="https://bbs.eeworld.com.cn/thread-1118275-1-1.html" target="_blank">https://bbs.eeworld.com.cn/thread-1118275-1-1.html</a></p>
<p>MicroPython动手做(14)——掌控板之OLED屏幕<br />
<a href="https://bbs.eeworld.com.cn/thread-1118389-1-1.html" target="_blank">https://bbs.eeworld.com.cn/thread-1118389-1-1.html</a></p>
<p>MicroPython动手做(15)——掌控板之AB按键<br />
<a href="https://bbs.eeworld.com.cn/thread-1118496-1-1.html" target="_blank">https://bbs.eeworld.com.cn/thread-1118496-1-1.html</a></p>
<p>MicroPython动手做(16)——掌控板之图片图像显示<br />
<a href="https://bbs.eeworld.com.cn/thread-1118945-1-1.html" target="_blank">https://bbs.eeworld.com.cn/thread-1118945-1-1.html</a></p>
<p>MicroPython动手做(17)——掌控板之触摸引脚<br />
<a href="https://bbs.eeworld.com.cn/thread-1119462-1-1.html" target="_blank">https://bbs.eeworld.com.cn/thread-1119462-1-1.html</a></p>
<p>MicroPython动手做(18)——掌控板之声光传感器<br />
<a href="https://bbs.eeworld.com.cn/thread-1119583-1-1.html" target="_blank">https://bbs.eeworld.com.cn/thread-1119583-1-1.html</a></p>
<p>MicroPython动手做(19)——掌控板之蜂鸣器与音乐<br />
<a href="https://bbs.eeworld.com.cn/thread-1119668-1-1.html" target="_blank">https://bbs.eeworld.com.cn/thread-1119668-1-1.html</a></p>
<p>MicroPython动手做(20)——掌控板之三轴加速度<br />
<a href="https://bbs.eeworld.com.cn/thread-1119998-1-1.html" target="_blank">https://bbs.eeworld.com.cn/thread-1119998-1-1.html</a></p>
<p>MicroPython动手做(21)——掌控板之磁场传感器<br />
<a href="https://bbs.eeworld.com.cn/thread-1120188-1-1.html" target="_blank">https://bbs.eeworld.com.cn/thread-1120188-1-1.html</a></p>
<p>MicroPython动手做(22)——掌控板之无线广播<br />
<a href="https://bbs.eeworld.com.cn/thread-1120835-1-1.html" target="_blank">https://bbs.eeworld.com.cn/thread-1120835-1-1.html</a></p>
<p>MicroPython动手做(23)——掌控板之WiFi与蓝牙<br />
<a href="https://bbs.eeworld.com.cn/thread-1120934-1-1.html" target="_blank">https://bbs.eeworld.com.cn/thread-1120934-1-1.html</a></p>
<p>MicroPython动手做(24)——掌控板之拓展掌控宝 <br />
<a href="https://bbs.eeworld.com.cn/thread-1121208-1-1.html" target="_blank">https://bbs.eeworld.com.cn/thread-1121208-1-1.html</a></p>
<p>MicroPython动手做(25)——语音合成与语音识别<br />
<a href="https://bbs.eeworld.com.cn/thread-1123752-1-1.html" target="_blank">https://bbs.eeworld.com.cn/thread-1123752-1-1.html</a></p>
<p>MicroPython动手做(26)——物联网之OneNET<br />
<a href="https://bbs.eeworld.com.cn/thread-1125172-1-1.html" target="_blank">https://bbs.eeworld.com.cn/thread-1125172-1-1.html</a></p>
<p>MicroPython动手做(27)——物联网之微信小程序<br />
<a href="https://bbs.eeworld.com.cn/thread-1125520-1-1.html" target="_blank">https://bbs.eeworld.com.cn/thread-1125520-1-1.html</a></p>
<p>MicroPython动手做(28)——物联网之Yeelight<br />
<a href="https://bbs.eeworld.com.cn/thread-1125939-1-1.html" target="_blank">https://bbs.eeworld.com.cn/thread-1125939-1-1.html</a></p>
<p>MicroPython动手做(29)——物联网之SIoT<br />
<a href="https://bbs.eeworld.com.cn/thread-1126090-1-1.html" target="_blank">https://bbs.eeworld.com.cn/thread-1126090-1-1.html</a></p>
<p><strong>7、局域网控制</strong></p>
<p>Yeelight 支持Google Assistant 和 Amazon Alexa 智能语音控制。还支持国内少有支持的IFTTT。它可以社交媒体、智能硬件等各类网络服务更好的联动。后续我们会讲解IFTTT的有关应用。 除此外,Yeelight还针对技术爱好者推出,第三方控制协议,可实现局域网内的个性化的控制。本文讲解的掌控板控制Yeelight智能照明设备就是用到该协议。</p>
<p> </p>
<p>Yeelight第三方控制协议:https://www.yeelight.com/download/Yeelight_Inter-Operation_Spec.pdf</p>
<p> </p>
<p>Yeelight 拥有完整的智能家居照明产品线,产品系列辐射家居照明系列、台上照明系列、氛围照明系列以及智能控制系列。集前沿技术和至美设计于一体是Yeelight一贯的追求。 AI技术、BLE MESH技术、全屋智能照明技术均旗下产品进行广泛应用,全线WiFi产品支持智能语音控制,灯光变化,尽在言语之间。</p>
<p> </p>
<p>掌控板提供 yeelight 驱动库,该库可在 awesome-mpython/libary/yeelight 获取。里面有更详细的 yeelight 模块的API说明。 yeelight.py 下载至掌控板的文件系统。掌控板连接到Yeelight相同的局域网内。</p>
<p><strong>8、MicroPython编程</strong></p>
<p> </p>
<p>(1)发现灯泡</p>
<p> </p>
<p>掌控板和Yeelight灯泡在同局域网内后,我们要控制灯泡,首先需要知道该灯泡的IP地址,我们可以使用 discover_bulbs() 函数:</p>
<p> </p>
<pre>
<code>from mpython import * # 导入mpython模块
from yeelight import * # 导入yeelight模块
my_wifi = wifi() # 连接到与YeeLight相同的局域网内
my_wifi.connectWiFi("ssid","password")
discover_bulbs() # 发现局域网内YeeLight的设备信息</code></pre>
<p> </p>
<p>网内的Yeelight灯泡响应并返回包含bulbs属性的字典:</p>
<p> </p>
<pre>
<code>>>> discover_bulbs()
[{'ip': '192.168.0.8', 'capabilities': {'rgb': '16711680', 'bright': '100', 'support': 'get_prop set_default set_power toggle set_bright start_cf stop_cf set_scene cron_add cron_get cron_del set_ct_abx set_rgb set_hsv set_adjust adjust_bright adjust_ct adjust_color set_music set', 'sat': '100', 'power': 'off', 'id': '0x0000000007e7544d', 'name': '', 'fw_ver': '26', 'color_mode': '2', 'hue': '359', 'ct': '3500', 'model': 'color'}, 'port': '55443'}]</code></pre>
<p>discover_bulbs() 函数,可获取网内Yeelight设备的属性。从上述返回的来看,该灯泡的IP地址为 192.168.0.8 。</p>
<p> </p>
<p>(2)开关控制</p>
<p> </p>
<p>知道IP地址后,我们构建 Bulb 对象,对灯泡开关控制:</p>
<p> </p>
<pre>
<code>bulb=Bulb("192.168.0.8") # 构建对象
bulb.turn_on() # 开灯指令
bulb.turn_off() # 关灯指令</code></pre>
<p> </p>
<p>除了 turn_on() 、turn_off() 还可使用 toggle() 反转状态。</p>
<p>(3)亮度调节</p>
<p> </p>
<pre>
<code>bulb.set_brightness(100)</code></pre>
<p> </p>
<p>set_brightness(brightness) , brightness 参数为亮度值,可调范围0~100 。</p>
<p> </p>
<p> </p>
<p>(4)设置颜色</p>
<pre>
<code>bulb.set_rgb(255,0,0) # 通过RGB设置灯泡颜色
bulb.set_hsv(180,100) # 通过HSV设置灯泡颜色
bulb.set_color_temp(1700) # 设置灯泡色温</code></pre>
<p> </p>
<p>yeelight 模块提供 set_rgb(red, green, blue) 和 set_hsv(hue, saturation) 两个函数。"RGB" 和"HSV" 两种颜色模型来设置灯泡灯光颜色。RGB颜色模型比较常用,相信大家并不陌生。通过对红(R)、绿(G)、蓝(B)三个颜色通道的变化以及它们相互之间的叠加来得到各式各样的颜色。 HSV(Hue Saturation Value)颜色模型:hue 色调,用角度度量,取值范围为0~359,从红色开始按逆时针方向计算,红色为0°,绿色为120°,蓝色为240°。saturation 饱和度,表示颜色接近光谱色的程度。颜色的饱和度也就愈高。饱和度高,颜色则深而艳。范围0~100。 Value亮度参数,未提供支持。只需设置 hue 、saturation 参数即可。在做些彩虹效果,颜色过渡时,HSV更为自然。</p>
<p> </p>
<p>还可以使用 set_color_temp(degrees) 函数设置灯泡色温, degrees 色温参数,范围1700~6500。</p>
<p> </p>
<p></p>
<p> </p>
<p> </p>
<p>注意</p>
<p>Yeelight, 目前WiFi智能设备最多支持4个同时TCP连接。超过的连接尝试将被拒绝。对于每个连接,都有一个命令消息配额限制, 也就是每分钟60个指令。所有LAN也有一个总配额限制,144。</p>