Ein Python-Connector für WiZ-Geräte.
https://docs.pro.wizconnected.com/#introduction
pip install pywizlight
Hinweis: Erfordert Python-Version >=3.7
.
Auf einem Fedora-basierten System oder auf einer CentOS/RHEL 8-Maschine, auf der EPEL aktiviert ist, da pywizlight
in der Fedora-Paketsammlung vorhanden ist.
sudo dnf -y install python3-pywizlight
Für NixOS und Nix ist die neueste Version von pywizlight
normalerweise im unstable
-Kanal verfügbar. Stabile Versionen enthalten möglicherweise ältere Versionen von pywizlight
.
nix-env -iA nixos.python37Packages.pywizlight
Seth Nickell | David Zurow | Eduardo Ibanez | Angad Singh | Fabian Affolter | Henry Ruhs | Alberto Panu |
skitterrusty | Mathias Roth | durnezj | Noëlle | Patrick Kelley | Ellis Michael | Gughan Ravikumar |
Charlotte | Aarni Koskela | UH-60 | J. Nick Koston |
Um Glühbirnen per CLI zu finden, können Sie Folgendes verwenden:
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
ist ein Befehlszeilentool zur Durchführung grundlegender Interaktionen mit Glühbirnen.
$ 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}
Führen Sie wizlight COMMAND --help
aus, um Verwendung und Optionen anzuzeigen.
Die Erkennung funktioniert mit einer UDP-Broadcast-Anfrage und sammelt alle Glühbirnen im Netzwerk.
Für asynchrone E/A verwendet diese Komponente den in Python integrierten asyncio DatagramTransport, der einen vollständig nicht blockierenden UDP-Transport ermöglicht.
wizlight(ip)
: Erstellt eine Instanz einer WiZ-Glühbirne. Konstruiert mit der IP addCancel changesress der Glühbirne.
Zuerst müssen Sie den Status abrufen, indem Sie light.updateState()
aufrufen. Danach können alle Zustände von light.state
abgerufen werden, einem PilotParser
Objekt.
PilotParser.get_brightness()
erhält den Wert der Helligkeit 0-255
PilotParser.get_rgb()
ruft den RGBW-Farbzustand der Glühbirne ab
PilotParser.get_colortemp()
ermittelt die Farbtemperatur der Glühbirne
PilotParser.get_warm_white/get_cold_white()
ruft die aktuelle Warm/Kalt-Einstellung ab (wird von Original-Philips-Wiz-Glühbirnen nicht unterstützt)
PilotParser.get_scene()
ruft den aktuellen Szenennamen ab
PilotParser.get_state()
gibt True/False zurück. True = ein, False = aus
getBulbConfig(self)
gibt die Hardwarekonfiguration der Glühbirne zurück
updateState(self)
ruft mithilfe von sendUDPMessage
den aktuellen Lampenstatus der Lampe ab und setzt ihn auf self.state
lightSwitch(self)
schaltet die Glühbirne wie ein Schalter ein oder aus
getMAC(self)
gibt die MAC-Adresse der Glühbirne zurück. Kann als eindeutige ID verwendet werden
sendUDPMessage(self, message, timeout = 60, send_interval = 0.5, max_send_datagrams = 100):
Sendet die UDP-Nachricht an die Glühbirne. Da bei UDP Pakete verloren gehen können und Ihre Lampe möglicherweise weit vom Router entfernt ist, senden wir kontinuierlich das UDP-Befehlsdatagramm, bis die Glühbirne eine Antwort erhält. In Tests hat das viel besser funktioniert, als nur einmal zu senden und auf eine Zeitüberschreitung zu warten. Sie können das Zeitlimit für den asynchronen Vorgang mithilfe von timeout
festlegen, das Zeitintervall für den Ruhezustand zwischen kontinuierlichen UDP-Sendungen mithilfe von send_interval
und die maximale Anzahl kontinuierlich zu sendender Pings mithilfe von max_send_datagrams
festlegen. Für setPilot
(Lichtstatus festlegen) und getPilot
(Lichtstatus abrufen) ist bereits ein niedrigerer Wert fest codiert, um ein Flackern des Lichts zu vermeiden.
turn_off(self)
schaltet das Licht aus
turn_on(PilotBuilder)
schaltet das Licht ein. Dazu wird ein PilotBuilder
Objekt benötigt, mit dem alle Parameter programmgesteuert eingestellt werden können – RGB, Farbtemperatur, Helligkeit usw. Um das Licht in den Rhythmusmodus zu versetzen, erstellen Sie einen leeren PilotBuilder
.
get_power(self)
gibt den aktuellen Stromverbrauch eines Smart Plug mit Metering zurück.
Nachricht an die Glühbirne senden: {"method":"setPilot","params":{"r":255,"g":255,"b":255,"dimming":50}}
Antwort: {"method":"setPilot","env":"pro","result":{"success":true}}
Status der Glühbirne abrufen: {"method":"getPilot","params":{}}
Antworten:
Benutzerdefinierter Farbmodus:
{'method': 'getPilot', 'env': 'pro', 'result': {'mac': 'a8bb50a4f94d', 'rssi': -60, 'src': '', 'state': True, 'sceneId': 0, 'temp': 5075, 'dimming': 47}}
Szenenmodus:
{'method': 'getPilot', 'env': 'pro', 'result': {'mac': 'a8bb50a4f94d', 'rssi': -65, 'src': '', 'state': True, 'sceneId': 12, 'speed': 100, 'temp': 4200, 'dimming': 47}}
Rhythmusmodus:
{'method': 'getPilot', 'env': 'pro', 'result': {'mac': 'a8bb50a4f94d', 'rssi': -63, 'src': '', 'state': True, 'sceneId': 14, 'speed': 100, 'dimming': 100, 'schdPsetId': 9}}