Un connecteur Python pour les appareils WiZ.
https://docs.pro.wizconnected.com/#introduction
pip install pywizlight
Remarque : Nécessite la version Python >=3.7
.
Sur un système basé sur Fedora ou sur une machine CentOS/RHEL 8 sur laquelle EPEL est activé, car pywizlight
est présent dans la collection de packages Fedora.
sudo dnf -y install python3-pywizlight
Pour NixOS et Nix, la dernière version de pywizlight
est généralement disponible dans le canal unstable
. Les versions stables peuvent contenir des versions plus anciennes de pywizlight
.
nix-env -iA nixos.python37Packages.pywizlight
Seth Nickell | David Zurow | Eduardo Ibánez | Angad Singh | Fabien Affolter | Henri Ruhs | Alberto Panu |
skitterrouille | Mathias Roth | durnezj | Noëlle | Patrick Kelley | Ellis Michael | Gughan Ravikumar |
Charlotte | Aarni Koskela | UH-60 | J. Nick Koston |
Pour trouver des ampoules via cli, vous pouvez utiliser ce qui suit :
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
est un outil en ligne de commande permettant d'effectuer des interactions de base avec les ampoules.
$ 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}
Exécutez wizlight COMMAND --help
pour voir l'utilisation et les options.
La découverte fonctionne avec une requête UDP Broadcast et collecte toutes les ampoules du réseau.
Pour les E/S asynchrones, ce composant utilise le DatagramTransport asyncio intégré de Python, qui permet un transport UDP totalement non bloquant.
wizlight(ip)
: Crée une instance d'une ampoule WiZ. Construit avec l'IP addCancel changesress de l'ampoule.
Vous devez d’abord récupérer l’état en appelant light.updateState()
. Après cela, tous les états peuvent être récupérés à partir de light.state
, qui est un objet PilotParser
.
PilotParser.get_brightness()
obtient la valeur de la luminosité 0-255
PilotParser.get_rgb()
obtient l'état de couleur RVBW de l'ampoule
PilotParser.get_colortemp()
obtient la température de couleur de l'ampoule
PilotParser.get_warm_white/get_cold_white()
obtient le réglage chaud/froid actuel (non pris en charge par les ampoules Philips Wiz d'origine)
PilotParser.get_scene()
obtient le nom de la scène actuelle
PilotParser.get_state()
renvoie True/False. Vrai = activé, Faux = désactivé
getBulbConfig(self)
renvoie la configuration matérielle de l'ampoule
updateState(self)
obtient l'état actuel de l'ampoule à partir de la lumière à l'aide de sendUDPMessage
et le définit sur self.state
lightSwitch(self)
allume ou éteint l'ampoule comme un interrupteur
getMAC(self)
renvoie l'adresse MAC de l'ampoule. Peut être utilisé comme identifiant unique
sendUDPMessage(self, message, timeout = 60, send_interval = 0.5, max_send_datagrams = 100):
envoie le message UDP à l'ampoule. Étant donné que UDP peut perdre des paquets et que votre lumière peut être éloignée du routeur, nous continuons à envoyer le datagramme de commande UDP jusqu'à ce qu'il y ait une réponse de l'ampoule. Lors des tests, cela a bien mieux fonctionné que d'envoyer une seule fois et d'attendre un délai d'attente. Vous pouvez définir le délai d'expiration de l'opération asynchrone à l'aide timeout
, définir l'intervalle de temps de mise en veille entre les envois UDP continus à l'aide send_interval
et le nombre maximum de pings continus à envoyer à l'aide de max_send_datagrams
. Il est déjà codé en dur à une valeur inférieure pour setPilot
(définir l'état de la lumière) vs getPilot
(récupérer l'état de la lumière) pour éviter le scintillement de la lumière.
turn_off(self)
éteint la lumière
turn_on(PilotBuilder)
allume la lumière. Cela prend un objet PilotBuilder
, qui peut être utilisé pour définir tous les paramètres par programme - RVB, température de couleur, luminosité, etc. Pour régler la lumière en mode rythme, créez un PilotBuilder
vide.
get_power(self)
renvoie la consommation électrique actuelle d'une prise intelligente avec mesure.
Envoyer un message à l'ampoule : {"method":"setPilot","params":{"r":255,"g":255,"b":255,"dimming":50}}
Réponse : {"method":"setPilot","env":"pro","result":{"success":true}}
Obtenez l'état de l'ampoule : {"method":"getPilot","params":{}}
Réponses :
mode couleur personnalisé :
{'method': 'getPilot', 'env': 'pro', 'result': {'mac': 'a8bb50a4f94d', 'rssi': -60, 'src': '', 'state': True, 'sceneId': 0, 'temp': 5075, 'dimming': 47}}
mode scène :
{'method': 'getPilot', 'env': 'pro', 'result': {'mac': 'a8bb50a4f94d', 'rssi': -65, 'src': '', 'state': True, 'sceneId': 12, 'speed': 100, 'temp': 4200, 'dimming': 47}}
mode rythme :
{'method': 'getPilot', 'env': 'pro', 'result': {'mac': 'a8bb50a4f94d', 'rssi': -63, 'src': '', 'state': True, 'sceneId': 14, 'speed': 100, 'dimming': 100, 'schdPsetId': 9}}