Change to websocket
This commit is contained in:
parent
f302be85c0
commit
65774837c7
77
main.py
77
main.py
|
@ -1,20 +1,24 @@
|
|||
import asyncio
|
||||
import tkinter as tk
|
||||
from tkinter import ttk
|
||||
|
||||
import json
|
||||
from async_tkinter_loop import async_handler, async_mainloop
|
||||
from networking import send_to_server
|
||||
import color_utils
|
||||
|
||||
bg_color="#2e2e2e"
|
||||
bg_color = "#2e2e2e"
|
||||
|
||||
class App:
|
||||
def __init__(self) -> None:
|
||||
self.root = tk.Tk()
|
||||
self.root.attributes('-fullscreen', True)
|
||||
self.root.configure(bg=bg_color) # Set background color
|
||||
|
||||
# List of servers (IP, Port)
|
||||
self.servers = [("192.168.0.208", 80),("192.168.0.201", 80), ("192.168.0.202", 80), ("192.168.0.203", 80), ("192.168.0.206", 80)]
|
||||
self.lightgroups = {
|
||||
"light1": {"ids": [0], "settings": {"color": "#00ff00"}},
|
||||
"light2": {"ids": [0], "settings": {"color": "#ff0000"}}
|
||||
}
|
||||
|
||||
# Create Notebook for tabs
|
||||
self.notebook = ttk.Notebook(self.root)
|
||||
|
@ -22,12 +26,11 @@ class App:
|
|||
|
||||
# Create a tab for each server
|
||||
self.tabs = {}
|
||||
for server in self.servers:
|
||||
for key, value in self.lightgroups.items():
|
||||
tab = ttk.Frame(self.notebook)
|
||||
self.notebook.add(tab, text=f"{server[0]}:{server[1]}")
|
||||
self.notebook.add(tab, text=key)
|
||||
self.create_sliders(tab)
|
||||
self.tabs[server] = tab
|
||||
#self.root.configure(bg=bg_color)
|
||||
self.tabs[key] = tab
|
||||
|
||||
async_mainloop(self.root)
|
||||
|
||||
|
@ -40,25 +43,25 @@ class App:
|
|||
red_slider = tk.Scale(tab, from_=255, to=0, orient=tk.VERTICAL, length=slider_length, width=slider_width, label="Red")
|
||||
red_slider.set(0)
|
||||
red_slider.pack(side=tk.LEFT, padx=10)
|
||||
red_slider.bind("<ButtonRelease-1>", lambda event, srv=tab: self.update_colour(event, srv))
|
||||
red_slider.bind("<ButtonRelease-1>", lambda _: self.update_colour(tab))
|
||||
|
||||
# Green Slider
|
||||
green_slider = tk.Scale(tab, from_=255, to=0, orient=tk.VERTICAL, length=slider_length, width=slider_width, label="Green")
|
||||
green_slider.set(0)
|
||||
green_slider.pack(side=tk.LEFT, padx=10)
|
||||
green_slider.bind("<ButtonRelease-1>", lambda event, srv=tab: self.update_colour(event, srv))
|
||||
green_slider.bind("<ButtonRelease-1>", lambda _: self.update_colour(tab))
|
||||
|
||||
# Blue Slider
|
||||
blue_slider = tk.Scale(tab, from_=255, to=0, orient=tk.VERTICAL, length=slider_length, width=slider_width, label="Blue")
|
||||
blue_slider.set(0)
|
||||
blue_slider.pack(side=tk.LEFT, padx=10)
|
||||
blue_slider.bind("<ButtonRelease-1>", lambda event, srv=tab: self.update_colour(event, srv))
|
||||
blue_slider.bind("<ButtonRelease-1>", lambda _: self.update_colour(tab))
|
||||
|
||||
# Brightness Slider
|
||||
brightness_slider = tk.Scale(tab, from_=255, to=0, orient=tk.VERTICAL, length=slider_length, width=slider_width, label="Brightness")
|
||||
brightness_slider.set(127)
|
||||
brightness_slider.pack(side=tk.LEFT, padx=10)
|
||||
brightness_slider.bind("<ButtonRelease-1>", lambda event, srv=tab: self.update_colour(event, srv))
|
||||
brightness_slider.bind("<ButtonRelease-1>", lambda _: self.update_colour(tab))
|
||||
|
||||
tab.widgets = {
|
||||
'red_slider': red_slider,
|
||||
|
@ -68,23 +71,49 @@ class App:
|
|||
}
|
||||
|
||||
@async_handler
|
||||
async def update_colour(self, event, tab):
|
||||
async def update_colour(self, tab):
|
||||
"""Update color based on the slider values and send to the selected server."""
|
||||
red_slider = tab.widgets['red_slider']
|
||||
green_slider = tab.widgets['green_slider']
|
||||
blue_slider = tab.widgets['blue_slider']
|
||||
brightness_slider = tab.widgets['brightness_slider']
|
||||
try:
|
||||
# Retrieve slider values
|
||||
red_slider = tab.widgets['red_slider']
|
||||
green_slider = tab.widgets['green_slider']
|
||||
blue_slider = tab.widgets['blue_slider']
|
||||
brightness_slider = tab.widgets['brightness_slider']
|
||||
|
||||
r = red_slider.get()
|
||||
g = green_slider.get()
|
||||
b = blue_slider.get()
|
||||
brightness = brightness_slider.get()
|
||||
r = red_slider.get()
|
||||
g = green_slider.get()
|
||||
b = blue_slider.get()
|
||||
brightness = brightness_slider.get()
|
||||
|
||||
color = color_utils.adjust_brightness((r, b, g), brightness)
|
||||
print(color, brightness)
|
||||
# Adjust brightness
|
||||
color = color_utils.adjust_brightness((r, g, b), brightness)
|
||||
print(f"Adjusted color: {color}, Brightness: {brightness}")
|
||||
|
||||
# Convert RGB to hex color
|
||||
hex_color = f"#{color[0]:02x}{color[1]:02x}{color[2]:02x}"
|
||||
|
||||
# Get the selected server
|
||||
selected_server = self.notebook.tab(self.notebook.select(), "text")
|
||||
ids = self.lightgroups[selected_server]["ids"]
|
||||
|
||||
# Construct WebSocket payload
|
||||
payload = {
|
||||
"save": True,
|
||||
"ids": [0],
|
||||
"settings": {
|
||||
"colors": [hex_color], # Use the dynamically calculated hex color
|
||||
"brightness": brightness, # Use the brightness slider value
|
||||
"pattern": "on"
|
||||
}
|
||||
}
|
||||
|
||||
# Send the payload to the server
|
||||
await send_to_server(payload)
|
||||
print(f"Sent payload: {payload}")
|
||||
except Exception as e:
|
||||
print(f"Error updating color: {e}")
|
||||
# Optionally, display the error in the GUI
|
||||
|
||||
selected_server = self.notebook.tab(self.notebook.select(), "text").split(":")
|
||||
await send_to_server(bytes(color), (selected_server[0], int(selected_server[1])))
|
||||
|
||||
if __name__ == "__main__":
|
||||
app = App()
|
||||
|
|
|
@ -1,53 +1,29 @@
|
|||
import socket
|
||||
import asyncio
|
||||
import httpx
|
||||
from websockets import connect
|
||||
import websockets
|
||||
import json
|
||||
|
||||
async def send_color_data(color_data, servers):
|
||||
"""Send color data to all configured servers."""
|
||||
tasks = [send_to_server(color_data, server) for server in servers]
|
||||
await asyncio.gather(*tasks)
|
||||
|
||||
async def send_to_server(color_data, server):
|
||||
"""Connect to a server, send color data, and close the connection."""
|
||||
server_ip, server_port = server
|
||||
async def send_to_server(data):
|
||||
"""
|
||||
Send WebSocket data to the server.
|
||||
"""
|
||||
try:
|
||||
reader, writer = await asyncio.open_connection(server_ip, server_port)
|
||||
writer.write(color_data)
|
||||
await writer.drain()
|
||||
writer.close()
|
||||
await writer.wait_closed()
|
||||
print(f"Sent data to {server_ip}:{server_port}")
|
||||
except (socket.error, ConnectionError) as e:
|
||||
print(f"Error sending to {server_ip}:{server_port}: {e}")
|
||||
# Connect to the WebSocket server
|
||||
async with websockets.connect("ws://192.168.4.1:80/ws") as websocket:
|
||||
# Serialize data to JSON and send it
|
||||
await websocket.send(json.dumps(data))
|
||||
except (ConnectionError, websockets.exceptions.ConnectionClosed) as e:
|
||||
print(f"Error sending to {e}")
|
||||
|
||||
|
||||
async def post(server, endpoint, data=""):
|
||||
async with httpx.AsyncClient() as client:
|
||||
r = await client.post(f"http://{server}/{endpoint}", data=data)
|
||||
print(server, r)
|
||||
|
||||
|
||||
|
||||
async def main():
|
||||
|
||||
b = bytearray(180)
|
||||
try:
|
||||
ws1 = await connect("ws://10.1.1.200/external")
|
||||
await asyncio.gather(post("10.1.1.200", "pattern", "external"))
|
||||
while True:
|
||||
print("sync")
|
||||
|
||||
for i in range(len(b)):
|
||||
b[i] = 128
|
||||
await asyncio.gather(ws1.send(b))
|
||||
await asyncio.sleep(5)
|
||||
finally:
|
||||
await ws1.close()
|
||||
await asyncio.gather(post("10.1.1.200", "pattern", "off"))
|
||||
|
||||
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
asyncio.run(main())
|
||||
# Define the data to be sent
|
||||
data = {
|
||||
"settings": {
|
||||
"color": "#00ff00"
|
||||
}
|
||||
}
|
||||
|
||||
# Server details
|
||||
server = ("192.168.4.1", 80) # Example WebSocket server port
|
||||
|
||||
# Run the asynchronous function using asyncio.run
|
||||
asyncio.run(send_to_server(data, server))
|
||||
|
|
Loading…
Reference in New Issue