Un conector Python para dispositivos WiZ.
https://docs.pro.wizconnected.com/#introducción
pip install pywizlight
Nota: Requiere la versión de Python >=3.7
.
En un sistema basado en Fedora o en una máquina CentOS/RHEL 8 que tenga EPEL habilitado, ya que pywizlight
está presente en la colección de paquetes de Fedora.
sudo dnf -y install python3-pywizlight
Para NixOS y Nix, la última versión de pywizlight
suele estar disponible en el canal unstable
. Las versiones estables pueden incluir versiones anteriores de pywizlight
.
nix-env -iA nixos.python37Packages.pywizlight
Seth Nickell | David Zurow | Eduardo Ibáñez | Angad Singh | Fabián Affolter | Henry Ruhs | Alberto Panu |
resbaladizo | Matías Roth | durnezj | Noëlle | Patricio Kelley | Ellis Michael | Gughan Ravikumar |
charlotte | Aarni Koskela | UH-60 | J. Nick Koston |
Para buscar bombillas a través de cli puedes utilizar lo siguiente:
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
es una herramienta de línea de comandos para realizar interacciones básicas con bombillas.
$ 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}
Ejecute wizlight COMMAND --help
para ver el uso y las opciones.
El descubrimiento funciona con una solicitud de transmisión UDP y recopila todas las bombillas de la red.
Para E/S asíncronas, este componente utiliza el asyncio DatagramTransport integrado de Python, que permite el transporte UDP sin bloqueo.
wizlight(ip)
: crea una instancia de una bombilla WiZ. Construido con el cambiador IP addCancel de la bombilla.
Primero necesitas recuperar el estado llamando light.updateState()
. Después de eso, todos los estados se pueden obtener de light.state
, que es un objeto PilotParser
.
PilotParser.get_brightness()
obtiene el valor del brillo 0-255
PilotParser.get_rgb()
obtiene el estado de color rgbW de la bombilla
PilotParser.get_colortemp()
obtiene la temperatura de color de la bombilla
PilotParser.get_warm_white/get_cold_white()
obtiene la configuración actual de calor/frío (no compatible con las bombillas originales Philips Wiz)
PilotParser.get_scene()
obtiene el nombre de la escena actual
PilotParser.get_state()
devuelve Verdadero/Falso. Verdadero = activado, Falso = desactivado
getBulbConfig(self)
devuelve la configuración de hardware de la bombilla
updateState(self)
obtiene el estado actual de la bombilla de la luz usando sendUDPMessage
y lo establece en self.state
lightSwitch(self)
enciende o apaga la bombilla como un interruptor
getMAC(self)
devuelve la dirección MAC de la bombilla. Se puede utilizar como identificación única
sendUDPMessage(self, message, timeout = 60, send_interval = 0.5, max_send_datagrams = 100):
envía el mensaje UDP a la bombilla. Dado que UDP puede perder paquetes y su luz puede estar a una gran distancia del enrutador, seguimos enviando continuamente el datagrama de comando UDP hasta que haya una respuesta de la bombilla. En las pruebas, esto funcionó mucho mejor que simplemente enviar una vez y esperar un tiempo de espera. Puede configurar el tiempo de espera de la operación asíncrona usando timeout
, configurar el intervalo de tiempo para dormir entre envíos UDP continuos usando send_interval
y el número máximo de pings continuos para enviar usando max_send_datagrams
. Ya está codificado en un valor más bajo para setPilot
(establecer el estado de la luz) frente a getPilot
(buscar el estado de la luz) para evitar el parpadeo de la luz.
turn_off(self)
apaga la luz
turn_on(PilotBuilder)
enciende la luz. Esto requiere un objeto PilotBuilder
, que se puede usar para configurar todos los parámetros mediante programación: rgb, temperatura de color, brillo, etc. Para configurar la luz en modo de ritmo, cree un PilotBuilder
vacío.
get_power(self)
devuelve el consumo de energía actual de un enchufe inteligente con medición.
Enviar mensaje a la bombilla: {"method":"setPilot","params":{"r":255,"g":255,"b":255,"dimming":50}}
Respuesta: {"method":"setPilot","env":"pro","result":{"success":true}}
Obtener el estado de la bombilla: {"method":"getPilot","params":{}}
Respuestas:
modo de color personalizado:
{'method': 'getPilot', 'env': 'pro', 'result': {'mac': 'a8bb50a4f94d', 'rssi': -60, 'src': '', 'state': True, 'sceneId': 0, 'temp': 5075, 'dimming': 47}}
modo de escena:
{'method': 'getPilot', 'env': 'pro', 'result': {'mac': 'a8bb50a4f94d', 'rssi': -65, 'src': '', 'state': True, 'sceneId': 12, 'speed': 100, 'temp': 4200, 'dimming': 47}}
modo de ritmo:
{'method': 'getPilot', 'env': 'pro', 'result': {'mac': 'a8bb50a4f94d', 'rssi': -63, 'src': '', 'state': True, 'sceneId': 14, 'speed': 100, 'dimming': 100, 'schdPsetId': 9}}