-
Notifications
You must be signed in to change notification settings - Fork 1
/
kasa_device_manager.py
102 lines (68 loc) · 2.94 KB
/
kasa_device_manager.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
import asyncio
import kasa
import json
class KasaDeviceManager:
def __init__(self):
print("Initializing Kasa Device Manager")
self.devices = self._discover_devices()
# self._print_devices()
print("Finished initializing")
# Private methods
def _discover_devices(self, json_format=False):
discovered_devices = asyncio.run(kasa.Discover.discover(return_raw=json_format))
return discovered_devices
def _print_devices(self):
for ip_address, smart_device in self.devices.items():
asyncio.run(smart_device.update())
print(f"Device: {smart_device}")
print("--------------------------")
print("\n")
def _turn_off_device(self, device: kasa.SmartDevice):
print(f"Turning {device.alias} off")
asyncio.run(device.turn_off())
return True
def _turn_on_device(self, device: kasa.SmartDevice):
print(f"Turning {device.alias} on")
asyncio.run(device.turn_on())
return True
def _toggle_device(self, device: kasa.SmartDevice):
asyncio.run(device.update())
if device.is_on:
return self._turn_off_device(device)
else:
return self._turn_on_device(device)
# Public methods
def get_all_devices(self):
devices = []
for ip_address, smart_device in self.devices.items():
# Update to get the most current state of the device
asyncio.run(smart_device.update())
devices.append((smart_device, ip_address))
return devices
def rediscover_devices(self):
self.devices = self._discover_devices()
def get_device(self, device_name):
# Find the device and return the most current state of it
for ip_address, smart_device in self.devices.items():
asyncio.run(smart_device.update())
if device_name.lower() == smart_device.alias.lower():
return smart_device, ip_address
return None, None
def toggle_device_by_name(self, device_name):
for ip_address, smart_device in self.devices.items():
asyncio.run(smart_device.update())
if device_name.lower() == smart_device.alias.lower():
return self._toggle_device(smart_device)
return False
def turn_on_device_by_name(self, device_name):
for ip_address, smart_device in self.devices.items():
asyncio.run(smart_device.update())
if device_name.lower() == smart_device.alias.lower():
return self._turn_on_device(smart_device)
return False
def turn_off_device_by_name(self, device_name):
for ip_address, smart_device in self.devices.items():
asyncio.run(smart_device.update())
if device_name.lower() == smart_device.alias.lower():
return self._turn_off_device(smart_device)
return False