Skip to content

Commit 58a570d

Browse files
committed
Add power control for up to four relays (to keep GUI neat)
1 parent d46c90d commit 58a570d

2 files changed

Lines changed: 86 additions & 11 deletions

File tree

raw/Devices_Online/devices_online.be

Lines changed: 85 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ class dev_online_settings
4646
persist.dvo_time_highlight = webserver.arg('dvo13')
4747
persist.dvo_devicename = (webserver.arg('dvo1')) ? 1 : 0
4848
persist.dvo_ipaddress = (webserver.arg('dvo3')) ? 1 : 0
49+
persist.dvo_power = (webserver.arg('dvo8')) ? 1 : 0
4950
persist.dvo_version = (webserver.arg('dvo2')) ? 1 : 0
5051
persist.dvo_heap = (webserver.arg('dvo6')) ? 1 : 0
5152
persist.dvo_berryheap = (webserver.arg('dvo4')) ? 1 : 0
@@ -61,6 +62,7 @@ class dev_online_settings
6162
var dvo_time_highlight = persist.find("dvo_time_highlight", 10)
6263
var dvo_devicename = (persist.find("dvo_devicename", 0)) ? " checked" : ""
6364
var dvo_ipaddress = (persist.find("dvo_ipaddress", 0)) ? " checked" : ""
65+
var dvo_power = (persist.find("dvo_power", 0)) ? " checked" : ""
6466
var dvo_version = (persist.find("dvo_version", 0)) ? " checked" : ""
6567
var dvo_heap = (persist.find("dvo_heap", 0)) ? " checked" : ""
6668
var dvo_berryheap = (persist.find("dvo_berryheap", 0)) ? " checked" : ""
@@ -86,6 +88,7 @@ class dev_online_settings
8688
"<tr><td style=width:40px'><input id='dvo1' name='dvo1' type='checkbox'%s></td><td><b>Device Name</b></td></tr>"
8789
"<tr><td style=width:40px'> </td><td><b>Hostname</b></td></tr>"
8890
"<tr><td style=width:40px'><input id='dvo3' name='dvo3' type='checkbox'%s></td><td><b>IP Address</b></td></tr>"
91+
"<tr><td style=width:40px'><input id='dvo8' name='dvo8' type='checkbox'%s></td><td><b>Power</b></td></tr>"
8992
"<tr><td style=width:40px'><input id='dvo2' name='dvo2' type='checkbox'%s></td><td><b>Version</b></td></tr>"
9093
"<tr><td style=width:40px'><input id='dvo6' name='dvo6' type='checkbox'%s></td><td><b>Heap Free (KB)</b></td></tr>"
9194
"<tr><td style=width:40px'><input id='dvo4' name='dvo4' type='checkbox'%s></td><td><b>Berry Heap Usage (KB)</b></td></tr>"
@@ -98,7 +101,7 @@ class dev_online_settings
98101
"<button name='save' type='submit' class='button bgrn'>Save</button>"
99102
"</form>"
100103
"</fieldset>", dvo_lines, dvo_online_window, dvo_time_highlight,
101-
dvo_devicename, dvo_ipaddress, dvo_version, dvo_heap, dvo_berryheap, dvo_berryobject, dvo_wifirssi))
104+
dvo_devicename, dvo_ipaddress, dvo_power, dvo_version, dvo_heap, dvo_berryheap, dvo_berryobject, dvo_wifirssi))
102105

103106
webserver.content_button(webserver.BUTTON_CONFIGURATION) #- button back to conf page -#
104107
webserver.content_stop() #- end of web page -#
@@ -139,6 +142,7 @@ class devices_online
139142
persist.dvo_time_highlight = 10 # Highlight latest change duration in seconds
140143
persist.dvo_devicename = 0 # Show device name
141144
persist.dvo_ipaddress = 0 # Show IP address
145+
persist.dvo_power = 0 # Show power
142146
persist.dvo_version = 0 # Show version
143147
persist.dvo_heap = 0 # Show Heap (KB)
144148
persist.dvo_berryheap = 0 # Show Berry HeapUsed (KB)
@@ -242,9 +246,10 @@ class devices_online
242246
var berryheap = " "
243247
var berryobject = " "
244248
var wifirssi = " "
249+
var power = []
245250

246-
# 0 1 2 3 4 5 6 7 8 9 10 11 12
247-
var line = [topic, hostname, ipaddress, devicename, version, version_num, last_seen, uptime, uptime_sec, berryheap, wifirssi, heap, berryobject]
251+
# 0 1 2 3 4 5 6 7 8 9 10 11 12 13
252+
var line = [topic, hostname, ipaddress, devicename, version, version_num, last_seen, uptime, uptime_sec, berryheap, wifirssi, heap, berryobject, power]
248253
var update = 0;
249254
for i: self.list_devices.keys()
250255
if self.list_devices[i][0] == topic
@@ -256,9 +261,10 @@ class devices_online
256261
wifirssi = self.list_devices[i][10]
257262
heap = self.list_devices[i][11]
258263
berryobject = self.list_devices[i][12]
264+
power = self.list_devices[i][13]
259265
end
260266
# log(f"DVO: Discovery --- update {self.list_devices[i]}", 3)
261-
var update_line = [topic, hostname, ipaddress, devicename, version, version_num, last_seen, uptime, uptime_sec, berryheap, wifirssi, heap, berryobject]
267+
var update_line = [topic, hostname, ipaddress, devicename, version, version_num, last_seen, uptime, uptime_sec, berryheap, wifirssi, heap, berryobject, power]
262268
# log(f"DVO: Discovery +++ update {update_line}", 3)
263269
self.list_devices[i] = update_line # Update current config
264270
break
@@ -314,6 +320,24 @@ class devices_online
314320
ipaddress = state['IPAddress'] # 192.168.2.208
315321
end
316322

323+
var power = [] # [0]
324+
var power_state = ""
325+
for i: 1..4
326+
if i == 1
327+
if state.find("POWER")
328+
power_state = state["POWER"]
329+
end
330+
end
331+
var keystr = f"POWER{i}"
332+
if state.find(keystr)
333+
power_state = state[keystr]
334+
end
335+
if size(power_state)
336+
power.push((power_state == "OFF") ? 0 : 1)
337+
power_state = ""
338+
end
339+
end
340+
317341
var last_seen = str(tasmota.rtc('local'))
318342
var uptime = state['Uptime'] # 0T00:15:09
319343
var uptime_sec_int
@@ -354,8 +378,8 @@ class devices_online
354378
end
355379
var wifirssi = format("%03i", wrssi) # 100 - Convert to string to enable multicolumn sort
356380

357-
# 0 1 2 3 4 5 6 7 8 9 10 11 12
358-
var line = [topic, hostname, ipaddress, devicename, version, version_num, last_seen, uptime, uptime_sec, berryheap, wifirssi, heap, berryobject]
381+
# 0 1 2 3 4 5 6 7 8 9 10 11 12 13
382+
var line = [topic, hostname, ipaddress, devicename, version, version_num, last_seen, uptime, uptime_sec, berryheap, wifirssi, heap, berryobject, power]
359383

360384
var dvo_online_window = int(persist.find("dvo_online_window", 600))
361385
var time_window = int(last_seen) - dvo_online_window
@@ -441,6 +465,36 @@ class devices_online
441465
end
442466
self.sort_last_column = persist.dvo_column
443467
persist.save()
468+
elif webserver.has_arg("sd_pow")
469+
var power_splits = string.split(webserver.arg("sd_pow"), "_")
470+
var topic = power_splits[0]
471+
var power = int(power_splits[1])
472+
var fulltopic = tasmota.cmd('_FullTopic', true)['FullTopic']
473+
var prefix = tasmota.cmd("_Prefix", true)['Prefix1'] # cmnd = Prefix1 used by commands
474+
fulltopic = string.replace(fulltopic, "%prefix%", prefix)
475+
fulltopic = string.replace(fulltopic, "%topic%", topic)
476+
if fulltopic[-1] != '/'
477+
fulltopic += '/'
478+
end
479+
480+
var power_state = 0
481+
for i: self.list_devices.keys()
482+
# Use topic as line index may have changed since GUI sd_pow was initiated
483+
if self.list_devices[i][0] == topic
484+
# We do not want to subscribe to power response so ...
485+
# we need some abracadabra as direct manipulation ends in exception
486+
var power_list = self.list_devices[i][13]
487+
power_state = power_list[power -1] ^ 1 # Toggle state
488+
power_list[power -1] = power_state
489+
self.list_devices[i][13] = power_list
490+
491+
# log(format("DVO: publish %sPOWER%d %d", fulltopic, power, power_state), 3)
492+
493+
# tasmota.cmd(format("publish %sPOWER%d 2", fulltopic, power), true)
494+
tasmota.cmd(format("publish %sPOWER%d %d", fulltopic, power, power_state), true)
495+
break;
496+
end
497+
end
444498
end
445499

446500
if self.list_devices.size()
@@ -449,6 +503,7 @@ class devices_online
449503
var dvo_time_highlight = int(persist.find("dvo_time_highlight", 10))
450504
var dvo_devicename = persist.find("dvo_devicename", 0)
451505
var dvo_ipaddress = persist.find("dvo_ipaddress", 0)
506+
var dvo_power = persist.find("dvo_power", 0)
452507
var dvo_version = persist.find("dvo_version", 0)
453508
var dvo_heap = persist.find("dvo_heap", 0)
454509
var dvo_berryheap = persist.find("dvo_berryheap", 0)
@@ -468,6 +523,9 @@ class devices_online
468523
if dvo_ipaddress
469524
msg += "<th>IP Address&nbsp</th>"
470525
end
526+
if dvo_power
527+
msg += "<th>Power&nbsp</th>"
528+
end
471529
if dvo_version
472530
msg += "<th>Version&nbsp</th>"
473531
end
@@ -485,8 +543,8 @@ class devices_online
485543
end
486544
msg += "<th align='right'>Uptime&nbsp</th>"
487545
else # All devices sorted by user selected column
488-
# 0 1 2 3 4 5 6 7 8 9 10 11 12
489-
var list_dvo = [0, 1, dvo_ipaddress, dvo_devicename, 0, dvo_version, 0, 0, 1, dvo_berryheap, dvo_wifirssi, dvo_heap, dvo_berryobject]
546+
# 0 1 2 3 4 5 6 7 8 9 10 11 12 13
547+
var list_dvo = [0, 1, dvo_ipaddress, dvo_devicename, 0, dvo_version, 0, 0, 1, dvo_berryheap, dvo_wifirssi, dvo_heap, dvo_berryobject, 0]
490548
if persist.dvo_column >= list_dvo.size() || list_dvo[persist.dvo_column] == 0
491549
persist.dvo_column = 1 # Hostname as default sort column
492550
self.sort_last_column = persist.dvo_column
@@ -507,6 +565,9 @@ class devices_online
507565
if dvo_ipaddress
508566
msg += format("<th><a href='#p' onclick='la(\"&sd_sort=2\");'>IP Address</a>%s&nbsp</th>", persist.dvo_column == 2 ? icon_direction : "")
509567
end
568+
if dvo_power
569+
msg += format("<th>Power&nbsp</th>")
570+
end
510571
if dvo_version
511572
msg += format("<th><a href='#p' onclick='la(\"&sd_sort=5\");'>Version</a>%s&nbsp</th>", persist.dvo_column == 5 ? icon_direction : "")
512573
end
@@ -532,8 +593,8 @@ class devices_online
532593
var devices = 0
533594
var now = tasmota.rtc('local')
534595
for i: self.list_devices.keys()
535-
# 0 1 2 3 4 5 6 7 8 9 10 11 12
536-
# [topic, hostname, ipaddress, devicename, version, version_num, last_seen, uptime, uptime_sec, berryheap, wifirssi, heap, berryobject]
596+
# 0 1 2 3 4 5 6 7 8 9 10 11 12 13
597+
# [topic, hostname, ipaddress, devicename, version, version_num, last_seen, uptime, uptime_sec, berryheap, wifirssi, heap, berryobject, power]
537598
var uptime = self.list_devices[i][7]
538599
if uptime == " " continue end # No STATE info
539600

@@ -544,6 +605,7 @@ class devices_online
544605
if list_index > dvo_lines continue end # Keep counting devices
545606
end
546607

608+
var topic = self.list_devices[i][0]
547609
var hostname = self.list_devices[i][1]
548610
var ipaddress = self.list_devices[i][2]
549611
var devicename = self.list_devices[i][3]
@@ -554,6 +616,7 @@ class devices_online
554616
var wifirssi = self.list_devices[i][10]
555617
var heap = self.list_devices[i][11]
556618
var berryobject = self.list_devices[i][12]
619+
var power = self.list_devices[i][13]
557620

558621
msg = "<tr>"
559622
if dvo_devicename
@@ -563,6 +626,18 @@ class devices_online
563626
if dvo_ipaddress
564627
msg += format("<td><a target=_blank href='http://%s'>%s&nbsp</a></td>", ipaddress, ipaddress)
565628
end
629+
if dvo_power
630+
if power.size()
631+
msg += "<td>"
632+
for p: power.keys()
633+
msg += format("<a href='#p'%s title='Toggle POWER%d' onclick='la(\"&sd_pow=%s_%d\");'>%s&nbsp</a>",
634+
(power[p]) ? " style='color:lime;'" : "", p +1, topic, p +1, (power[p]) ? "&#x2612" : "&#x2610")
635+
end
636+
msg += "</td>"
637+
else
638+
msg += "<td>&nbsp</td>"
639+
end
640+
end
566641
if dvo_version
567642
msg += format("<td>%s&nbsp</td>", version)
568643
end

raw/Devices_Online/manifest.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "Devices Online",
3-
"version": "0x190A0B00",
3+
"version": "0x190A0D00",
44
"description": "Display devices online info",
55
"author": "Theo Arends",
66
"min_tasmota": "0x09040000",

0 commit comments

Comments
 (0)