ตัวเชื่อมต่อ Python สำหรับอุปกรณ์ WiZ
https://docs.pro.wizconnected.com/#introduction
pip install pywizlight
หมายเหตุ: ต้องใช้เวอร์ชัน Python >=3.7
บนระบบที่ใช้ Fedora หรือบนเครื่อง CentOS/RHEL 8 ซึ่งเปิดใช้งาน EPEL เนื่องจากมี pywizlight
อยู่ใน Fedora Package Collection
sudo dnf -y install python3-pywizlight
สำหรับ NixOS และ Nix pywizlight
รุ่นล่าสุดมักจะพร้อมใช้งานในช่อง unstable
รุ่นเสถียรอาจมี pywizlight
เวอร์ชันเก่ามาด้วย
nix-env -iA nixos.python37Packages.pywizlight
เซธ นิคเคลล์ | เดวิด ซูโรว์ | เอดูอาร์โด้ อิบาเนซ | อังกัด ซิงห์ | ฟาเบียน อัฟฟอลเตอร์ | เฮนรี รูห์ส | อัลเบอร์โต ปานู |
ขี้เล่นเป็นสนิม | มาเธียส รอธ | ดูร์เนซจ | โนเอล | แพทริค เคลลีย์ | เอลลิส ไมเคิล | กูกัน ราวิกุมาร์ |
ชาร์ล็อตต์ | อาร์นี คอสเกลา | ยูเอช-60 | เจ. นิค คอสตัน |
หากต้องการค้นหาหลอดไฟผ่าน cli คุณสามารถใช้สิ่งต่อไปนี้:
python -m pywizlight.cli discover
import asyncio
from pywizlight import wizlight , PilotBuilder , discovery
async def main ():
"""Sample code to work with bulbs."""
# Discover all bulbs in the network via broadcast datagram (UDP)
# function takes the discovery object and returns a list of wizlight objects.
bulbs = await discovery . discover_lights ( broadcast_space = "192.168.1.255" )
# Print the IP address of the bulb on index 0
print ( f"Bulb IP address: { bulbs [ 0 ]. ip } " )
# Iterate over all returned bulbs
for bulb in bulbs :
print ( bulb . __dict__ )
# Turn off all available bulbs
# await bulb.turn_off()
# Set up a standard light
light = wizlight ( "192.168.1.27" )
# Set up the light with a custom port
#light = wizlight("your bulb's IP address", port=12345)
# The following calls need to be done inside an asyncio coroutine
# to run them from normal synchronous code, you can wrap them with
# asyncio.run(..).
# Turn the light on into "rhythm mode"
await light . turn_on ( PilotBuilder ())
# Set bulb brightness
await light . turn_on ( PilotBuilder ( brightness = 255 ))
# Set bulb brightness (with async timeout)
timeout = 10
await asyncio . wait_for ( light . turn_on ( PilotBuilder ( brightness = 255 )), timeout )
# Set bulb to warm white
await light . turn_on ( PilotBuilder ( warm_white = 255 ))
# Set RGB values
# red to 0 = 0%, green to 128 = 50%, blue to 255 = 100%
await light . turn_on ( PilotBuilder ( rgb = ( 0 , 128 , 255 )))
# Get the current color temperature, RGB values
state = await light . updateState ()
print ( state . get_colortemp ())
red , green , blue = state . get_rgb ()
print ( f"red { red } , green { green } , blue { blue } " )
# Start a scene
await light . turn_on ( PilotBuilder ( scene = 4 )) # party
# Get the name of the current scene
state = await light . updateState ()
print ( state . get_scene ())
# Get the features of the bulb
bulb_type = await bulbs [ 0 ]. get_bulbtype ()
print ( bulb_type . features . brightness ) # returns True if brightness is supported
print ( bulb_type . features . color ) # returns True if color is supported
print ( bulb_type . features . color_tmp ) # returns True if color temperatures are supported
print ( bulb_type . features . effect ) # returns True if effects are supported
print ( bulb_type . kelvin_range . max ) # returns max kelvin in INT
print ( bulb_type . kelvin_range . min ) # returns min kelvin in INT
print ( bulb_type . name ) # returns the module name of the bulb
# Turn the light off
await light . turn_off ()
# Do operations on multiple lights in parallel
#bulb1 = wizlight("<your bulb1 ip>")
#bulb2 = wizlight("<your bulb2 ip>")
# --- DEPRECATED in 3.10 see [#140](https://github.com/sbidy/pywizlight/issues/140)
# await asyncio.gather(bulb1.turn_on(PilotBuilder(brightness = 255)),
# bulb2.turn_on(PilotBuilder(warm_white = 255)))
# --- For >3.10 await asyncio.gather() from another coroutine
# async def turn_bulbs_on(bulb1, bulb2):
# await asyncio.gather(bulb1.turn_on(PilotBuilder(warm_white=255)), bulb2.turn_on(PilotBuilder(warm_white=255)))
# def main:
# asyncio.run(async turn_bulbs_on(bulb1, bulb2))
loop = asyncio . get_event_loop ()
loop . run_until_complete ( main ())
wizlight
เป็นเครื่องมือบรรทัดคำสั่งเพื่อดำเนินการโต้ตอบพื้นฐานกับหลอดไฟ
$ wizlight
Usage: wizlight [OPTIONS] COMMAND [ARGS]...
Simple command-line tool to interact with Wizlight bulbs.
Options:
--version Show the version and exit.
--help Show this message and exit.
Commands:
discover Discover bulb in the local network.
off Turn the bulb off.
on Turn the bulb on.
set-state Set the current state of a given bulb.
state Get the current state from the given bulb.
$ wizlight discover --b 192.168.0.101
Search for bulbs in 192.168.0.101 ...
{'ip_address': '192.168.0.101', 'mac_address': 'a8bs4090193d'}
$ wizlight on --ip 192.168.0.101 --k 3000 --brightness 128
Turning on 192.168.0.101
$ wizlight off --ip 192.168.0.101
Turning off 192.168.0.101
$ wizlight state --ip 192.168.0.101
{'mac': 'a8bs4090193d', 'rssi': -57, 'src': '', 'state': False, 'sceneId': 0, 'temp': 3000, 'dimming': 50}
เรียกใช้ wizlight COMMAND --help
เพื่อดูการใช้งานและตัวเลือก
การค้นพบนี้ทำงานร่วมกับคำขอ UDP Broadcast และรวบรวมหลอดไฟทั้งหมดในเครือข่าย
สำหรับ async I/O คอมโพเนนต์นี้ใช้ asyncio DatagramTransport ในตัวของ Python ซึ่งอนุญาตให้มีการขนส่ง UDP ที่ไม่ปิดกั้นโดยสมบูรณ์
wizlight(ip)
: สร้างอินสแตนซ์ของหลอดไฟ WiZ สร้างด้วยการเปลี่ยนแปลง IP addCancel ของหลอดไฟ
ก่อนอื่นคุณต้องดึงข้อมูลสถานะโดยการเรียก light.updateState()
หลังจากนั้นสามารถดึงสถานะทั้งหมดได้จาก light.state
ซึ่งเป็นวัตถุ PilotParser
PilotParser.get_brightness()
รับค่าความสว่าง 0-255
PilotParser.get_rgb()
รับสถานะสี rgbW ของหลอดไฟ
PilotParser.get_colortemp()
รับอุณหภูมิสีของหลอดไฟ
PilotParser.get_warm_white/get_cold_white()
รับการตั้งค่าอุ่น/เย็นในปัจจุบัน (ไม่รองรับหลอดไฟ Philips Wiz ดั้งเดิม)
PilotParser.get_scene()
รับชื่อฉากปัจจุบัน
PilotParser.get_state()
คืนค่า True/False จริง=เปิด เท็จ=ปิด
getBulbConfig(self)
ส่งคืนการกำหนดค่าฮาร์ดแวร์ของหลอดไฟ
updateState(self)
รับสถานะหลอดไฟปัจจุบันจากแสงโดยใช้ sendUDPMessage
และตั้งค่าเป็น self.state
lightSwitch(self)
สลับการเปิดหรือปิดหลอดไฟเหมือนกับสวิตช์
getMAC(self)
ส่งคืนที่อยู่ MAC ของหลอดไฟ สามารถใช้เป็น ID เฉพาะได้
sendUDPMessage(self, message, timeout = 60, send_interval = 0.5, max_send_datagrams = 100):
ส่งข้อความ UDP ไปยังหลอดไฟ เนื่องจาก UDP อาจสูญเสียแพ็กเก็ต และแสงของคุณอาจอยู่ห่างจากเราเตอร์เป็นระยะทางไกล เราจึงส่งดาตาแกรมคำสั่ง UDP อย่างต่อเนื่องจนกว่าจะมีการตอบสนองจากหลอดไฟ ในการทดสอบวิธีนี้ใช้ได้ผลดีกว่าการส่งเพียงครั้งเดียวและรอการหมดเวลา คุณสามารถตั้งค่าการหมดเวลาการดำเนินการอะซิงก์ได้โดยใช้ timeout
ตั้งค่าช่วงเวลาเป็นโหมดสลีประหว่างการส่ง UDP ต่อเนื่องโดยใช้ send_interval
และจำนวนสูงสุดของการ Ping ต่อเนื่องที่จะส่งโดยใช้ max_send_datagrams
ได้มีการฮาร์ดโค้ดเป็นค่าที่ต่ำกว่าสำหรับ setPilot
(ตั้งค่าสถานะแสง) กับ getPilot
(ดึงสถานะแสง) เพื่อป้องกันไม่ให้แสงกะพริบ
turn_off(self)
ปิดไฟ
turn_on(PilotBuilder)
เปิดไฟ สิ่งนี้ใช้วัตถุ PilotBuilder
ซึ่งสามารถใช้เพื่อตั้งค่าพารามิเตอร์ทั้งหมดโดยทางโปรแกรม - rgb อุณหภูมิสี ความสว่าง ฯลฯ หากต้องการตั้งค่าแสงเป็นโหมดจังหวะ ให้สร้าง PilotBuilder
ที่ว่างเปล่า
get_power(self)
ส่งคืนการใช้พลังงานปัจจุบันของ Smart Plug พร้อมการวัดแสง
ส่งข้อความถึงหลอดไฟ: {"method":"setPilot","params":{"r":255,"g":255,"b":255,"dimming":50}}
ตอบกลับ: {"method":"setPilot","env":"pro","result":{"success":true}}
รับสถานะของหลอดไฟ: {"method":"getPilot","params":{}}
คำตอบ:
โหมดสีที่กำหนดเอง:
{'method': 'getPilot', 'env': 'pro', 'result': {'mac': 'a8bb50a4f94d', 'rssi': -60, 'src': '', 'state': True, 'sceneId': 0, 'temp': 5075, 'dimming': 47}}
โหมดฉาก:
{'method': 'getPilot', 'env': 'pro', 'result': {'mac': 'a8bb50a4f94d', 'rssi': -65, 'src': '', 'state': True, 'sceneId': 12, 'speed': 100, 'temp': 4200, 'dimming': 47}}
โหมดจังหวะ:
{'method': 'getPilot', 'env': 'pro', 'result': {'mac': 'a8bb50a4f94d', 'rssi': -63, 'src': '', 'state': True, 'sceneId': 14, 'speed': 100, 'dimming': 100, 'schdPsetId': 9}}