@@ -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 </th>"
470525 end
526+ if dvo_power
527+ msg += "<th>Power </th>"
528+ end
471529 if dvo_version
472530 msg += "<th>Version </th>"
473531 end
@@ -485,8 +543,8 @@ class devices_online
485543 end
486544 msg += "<th align='right'>Uptime </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 </th>" , persist.dvo_column == 2 ? icon_direction : "" )
509567 end
568+ if dvo_power
569+ msg += format ( "<th>Power </th>" )
570+ end
510571 if dvo_version
511572 msg += format ( "<th><a href='#p' onclick='la(\"&sd_sort=5\");'>Version</a>%s </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 </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 </a>" ,
634+ ( power[ p]) ? " style='color:lime;'" : "" , p + 1 , topic, p + 1 , ( power[ p]) ? "☒" : "☐" )
635+ end
636+ msg += "</td>"
637+ else
638+ msg += "<td> </td>"
639+ end
640+ end
566641 if dvo_version
567642 msg += format ( "<td>%s </td>" , version)
568643 end
0 commit comments