Thursday, October 2, 2025

WiZ Akıllı Ampulleri PC'den Kontrol - Part II IP SCANNER

Daha önce Philips Wiz ampülleri python kütüphanelerini kullanarak PC'den kontrol etmeyi yazmıştım.

Wiz PC Kontrol

Zamanla dinamik network ortamında DHCP veya başka sebeplerden ampül TCPIP konfigürasyonları ve IP adreslerinin değişmesi dolayısıyla ampüllere ulaşmak için daha dinamik bir çözüm üretmek gerekti. Böylece networkteki Wiz ampülleri tarayıp IP adreslerini listeleyen bir uygulama yazdım.


Taramadan önce.

Tarama ağda üç ampül bulmuş.


Kod:


# -*- coding: utf-8 -*-

import tkinter as tk
from tkinter import messagebox
import asyncio
from pywizlight import wizlight, PilotBuilder
import socket

# IP araligini buradan ayarla
ip_range_start = 100
ip_range_end = 120
network_prefix = "192.168.1."

# GUI icinden cagirmak icin asyncio loop wrapper
class WizController:
    def __init__(self):
        self.loop = asyncio.new_event_loop()

    def turn_on(self, ip):
        self.loop.run_until_complete(self._turn_on(ip))

    def turn_off(self, ip):
        self.loop.run_until_complete(self._turn_off(ip))

    async def _turn_on(self, ip):
        try:
            bulb = wizlight(ip)
            await bulb.turn_on(PilotBuilder())
        except Exception as e:
            messagebox.showerror("Baglanti Hatasi", f"{ip} icin hata: {e}")

    async def _turn_off(self, ip):
        try:
            bulb = wizlight(ip)
            await bulb.turn_off()
        except Exception as e:
            messagebox.showerror("Baglanti Hatasi", f"{ip} icin hata: {e}")

    async def is_wiz_bulb(self, ip):
        try:
            bulb = wizlight(ip)
            await bulb.getPilot()
            return True
        except:
            return False

# Arayuz
app = tk.Tk()
app.title("WiZ Ampul Kontrol Paneli")
app.geometry("350x400")

controller = WizController()
frames = []

found_ips = []

# Tarama butonu ve alani
def scan_for_bulbs():
    result_box.delete(0, tk.END)
    found_ips.clear()
    for i in range(ip_range_start, ip_range_end + 1):
        ip = f"{network_prefix}{i}"
        try:
            socket.setdefaulttimeout(0.3)
            s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
            s.sendto(b'{"method":"getPilot"}', (ip, 38899))
            data, addr = s.recvfrom(1024)
            if b"method" in data:
                found_ips.append(ip)
                result_box.insert(tk.END, ip)
        except:
            continue

# Ampul kontrol paneli
button_frame = tk.Frame(app)
button_frame.pack(pady=10)

scan_btn = tk.Button(button_frame, text="Ampul Tara", command=scan_for_bulbs)
scan_btn.pack()

result_box = tk.Listbox(app, height=6)
result_box.pack(padx=10, pady=5, fill="x")

control_frame = tk.LabelFrame(app, text="Secilen IP'ye Komut Gonder", padx=10, pady=10)
control_frame.pack(padx=10, pady=10, fill="x")

btn_on = tk.Button(control_frame, text="Ac", width=10, command=lambda: controller.turn_on(result_box.get(tk.ACTIVE)))
btn_on.pack(side="left", padx=5)

btn_off = tk.Button(control_frame, text="Kapat", width=10, command=lambda: controller.turn_off(result_box.get(tk.ACTIVE)))
btn_off.pack(side="left", padx=5)

app.mainloop()