From b72bdf7a6db515b79917ee08f675ff9f6613acc5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jacek=20Zi=C3=B3=C5=82kowski?= Date: Mon, 7 Oct 2024 01:26:56 +0200 Subject: [PATCH] Fix IPAddress/Gateway show up for wired devices --- assets/ethernet.png | Bin 0 -> 454 bytes icons.qrc | 1 + tdmgr/GUI/delegates/devices.py | 11 +- tdmgr/GUI/icons.py | 168 +++++++++++------- tdmgr/models/devices.py | 17 +- tdmgr/models/roles.py | 4 + tdmgr/tasmota/device.py | 21 ++- .../jsonfiles/14.2.0.4/STATUS5.1.json | 2 +- tests/test_device.py | 16 ++ 9 files changed, 159 insertions(+), 81 deletions(-) create mode 100644 assets/ethernet.png diff --git a/assets/ethernet.png b/assets/ethernet.png new file mode 100644 index 0000000000000000000000000000000000000000..b192af9a82a1beae75f59df4a98140a834094e03 GIT binary patch literal 454 zcmV;%0XhDOP)Grg*KJ`dulvIPVC=TAmFgDoxGkIrvw+8K;RNbi z;J#ok!UqfHP~8Gv_XR7EELcu;3wYcXZh;4p`-06B8)!e}C6D&R*V|xNICTA6m<1p< zvK&Y)$rk8Nc@-(w@$^3o3xuwR1dsc|{{kT!;Nl>xH}zFG$rfl$emxh(g1|Kh3xd|5 zSfDfcCFzl_G2z8|WJCD|BI#`z=}a~Fm)h3 zL|fpv^lO9D(y#wPSU&G4P76SCFm)h3WLe-uBp#d={JmlNf5E<~V2qDF0xfV}`q{;C w>DP|kN6U|N>{zu7gz>RKYC(F4wt$)d0QI3ZdFFCizW@LL07*qoM6N<$g45g2H~;_u literal 0 HcmV?d00001 diff --git a/icons.qrc b/icons.qrc index 689abb1..c8915dd 100644 --- a/icons.qrc +++ b/icons.qrc @@ -10,6 +10,7 @@ .\assets\copy.png .\assets\disconnect.png .\assets\download.png + .\assets\ethernet.png .\assets\ip.png .\assets\logo.png .\assets\once.png diff --git a/tdmgr/GUI/delegates/devices.py b/tdmgr/GUI/delegates/devices.py index c7b0f59..066fb83 100644 --- a/tdmgr/GUI/delegates/devices.py +++ b/tdmgr/GUI/delegates/devices.py @@ -344,7 +344,7 @@ def paint(self, p: QPainter, option: QStyleOptionViewItem, index): col_name = self.get_column_name(index) if col_name == "Device": # draw signal strength icon - self.draw_rssi_pixmap(index, option, p) + self.draw_network_pixmap(index, option, p) device_rect = option.rect.adjusted(2 * GAP + ICON_SIZE.width(), 3, 0, 0) p.save() @@ -392,12 +392,15 @@ def paint(self, p: QPainter, option: QStyleOptionViewItem, index): else: QStyledItemDelegate.paint(self, p, option, index) - def draw_rssi_pixmap(self, index, option, p): + def draw_network_pixmap(self, index, option, p): p.save() px = self.rssi_offline if index.data(DeviceRoles.LWTRole): - rssi = index.data(DeviceRoles.RSSIRole) - px = get_pixmap_for_rssi(rssi) + if index.data(DeviceRoles.IsEthernetRole): + px = QPixmap(":/ethernet.png") + else: + rssi = index.data(DeviceRoles.RSSIRole) + px = get_pixmap_for_rssi(rssi) px_y = option.rect.y() + (option.rect.height() - ICON_SIZE.height()) // 2 px_rect = QRect(QPoint(option.rect.x() + GAP, px_y), ICON_SIZE) diff --git a/tdmgr/GUI/icons.py b/tdmgr/GUI/icons.py index 886811b..87c783b 100644 --- a/tdmgr/GUI/icons.py +++ b/tdmgr/GUI/icons.py @@ -1270,6 +1270,37 @@ \x84\x88\x69\x97\x0f\x14\x18\xf2\x49\x68\x14\x8c\x82\x51\x30\x0a\ \x06\x16\x00\x00\x8a\x37\x47\x8d\x8d\x83\xef\xa9\x00\x00\x00\x00\ \x49\x45\x4e\x44\xae\x42\x60\x82\ +\x00\x00\x01\xc6\ +\x89\ +\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ +\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\ +\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x0b\x13\x00\x00\x0b\x13\ +\x01\x00\x9a\x9c\x18\x00\x00\x01\x78\x49\x44\x41\x54\x78\x9c\x63\ +\x60\x18\x31\x80\xd7\x6d\x61\x2b\xaf\xfb\xc2\xff\x60\xec\xb6\xb0\ +\x95\xea\x16\xf0\xb8\x2d\x9c\x08\xb3\x80\xc7\x6d\xe1\x04\xea\x5b\ +\xe0\xbe\x60\x2e\xc2\x07\x0b\xe6\x50\xdd\x02\x5e\xf7\x05\x2b\x90\ +\x2c\x58\x4e\x75\x0b\x78\xdc\x16\x6e\x81\x07\x91\xfb\x82\xcd\x14\ +\x1b\x68\x3f\xe5\x25\x8f\xf6\xc4\xd7\xdb\x60\x58\x38\x74\xfd\x5b\ +\x98\x05\x20\x36\xb2\x1c\x48\x2d\xc9\x16\xe8\x4e\x79\x15\x29\xd7\ +\xf1\xf4\x3f\x0c\x0b\x84\xae\x87\x04\x8f\xfb\xc2\xff\x02\x21\x1b\ +\xe0\xe2\x20\xac\x37\xf5\x55\x38\xc9\x16\x68\x4d\x7e\x3d\x17\xc5\ +\x82\xc0\x35\x08\x0b\x82\xd6\xa0\x58\xa0\x33\xf9\x25\xe9\x91\xae\ +\x31\xe1\xc5\x79\x64\x43\xf8\xfd\x56\xc0\x2d\xe0\xf7\x5b\x89\x62\ +\x81\xc6\x84\x17\xe7\x48\xb6\x40\xb5\xf7\xf9\x7b\x64\x43\xf8\xbc\ +\x97\xc2\x2d\xe0\xf3\x59\x86\x62\x81\x4a\xef\x8b\xf7\xa4\x99\xfe\ +\xff\x3f\x93\x42\xe7\xd3\x7f\x20\xcd\x32\x8d\xf7\xe0\x06\xa3\x63\ +\x99\xa6\xfb\x60\x0b\x40\x6a\x41\x7a\x88\x36\xdf\x70\xca\x3b\x3b\ +\x98\xeb\x24\x4b\x2e\xe2\xb4\x00\x24\x07\x8f\xe8\x29\xef\x6c\x88\ +\xb6\x40\x77\xd2\x9b\x0e\x98\x46\xd1\x8c\xc3\xff\x05\xc3\x36\x60\ +\xc5\x20\x39\x98\x3a\xed\xa9\x6f\xda\x89\xf7\xc1\x8c\x77\xb3\xf4\ +\xa7\xbd\xf9\x0f\xc2\x52\x59\x87\xff\x8b\xa6\x1e\xc0\x8a\x41\x72\ +\x30\x75\x20\x3d\x44\x5b\xe0\xb8\xf4\x6b\x83\xd3\xd2\xaf\xff\x41\ +\x58\x3e\xef\x28\x4e\x0b\x40\x72\x30\x75\x20\x3d\x64\x59\xe0\x44\ +\x24\x1e\x9c\x16\xfc\xbd\x61\xfa\x7f\xc1\xbe\xa9\x60\x8c\x8f\x3d\ +\x02\x2d\x70\x5e\xfa\xd9\xc5\x71\xe9\xd7\x8e\xdd\x47\xcb\x8f\x74\ +\xec\x58\xb5\x0c\x84\xf1\xb1\x41\x6a\x41\x7a\x88\xb6\x80\x9a\x00\ +\x00\xf5\xa1\x36\x79\xe6\x72\x59\xbf\x00\x00\x00\x00\x49\x45\x4e\ +\x44\xae\x42\x60\x82\ \x00\x00\x01\x1e\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ @@ -2482,6 +2513,10 @@ \x08\xc8\x58\x67\ \x00\x73\ \x00\x61\x00\x76\x00\x65\x00\x2e\x00\x70\x00\x6e\x00\x67\ +\x00\x0c\ +\x09\x52\x8e\x67\ +\x00\x65\ +\x00\x74\x00\x68\x00\x65\x00\x72\x00\x6e\x00\x65\x00\x74\x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x0b\ \x0a\x36\xae\x27\ \x00\x73\ @@ -2541,7 +2576,7 @@ " qt_resource_struct_v1 = b"\ -\x00\x00\x00\x00\x00\x02\x00\x00\x00\x25\x00\x00\x00\x01\ +\x00\x00\x00\x00\x00\x02\x00\x00\x00\x26\x00\x00\x00\x01\ \x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\ \x00\x00\x00\x16\x00\x00\x00\x00\x00\x01\x00\x00\x06\xd5\ \x00\x00\x00\x34\x00\x00\x00\x00\x00\x01\x00\x00\x08\x4d\ @@ -2566,98 +2601,101 @@ \x00\x00\x02\x34\x00\x00\x00\x00\x00\x01\x00\x00\x42\xd8\ \x00\x00\x02\x50\x00\x00\x00\x00\x00\x01\x00\x00\x49\xd1\ \x00\x00\x02\x66\x00\x00\x00\x00\x00\x01\x00\x00\x4b\x7e\ -\x00\x00\x02\x82\x00\x00\x00\x00\x00\x01\x00\x00\x4c\xa0\ -\x00\x00\x02\xa4\x00\x00\x00\x00\x00\x01\x00\x00\x52\x5f\ -\x00\x00\x02\xba\x00\x00\x00\x00\x00\x01\x00\x00\x57\x85\ -\x00\x00\x02\xd6\x00\x00\x00\x00\x00\x01\x00\x00\x5c\x99\ -\x00\x00\x02\xee\x00\x00\x00\x00\x00\x01\x00\x00\x61\x0b\ -\x00\x00\x03\x0c\x00\x00\x00\x00\x00\x01\x00\x00\x67\x71\ -\x00\x00\x03\x28\x00\x00\x00\x00\x00\x01\x00\x00\x69\x07\ -\x00\x00\x03\x44\x00\x00\x00\x00\x00\x01\x00\x00\x6c\xef\ -\x00\x00\x03\x5e\x00\x00\x00\x00\x00\x01\x00\x00\x75\x52\ -\x00\x00\x03\x72\x00\x00\x00\x00\x00\x01\x00\x00\x7e\xc0\ -\x00\x00\x03\x8a\x00\x00\x00\x00\x00\x01\x00\x00\x81\xe4\ -\x00\x00\x03\xaa\x00\x00\x00\x00\x00\x01\x00\x00\x87\xef\ -\x00\x00\x03\xcc\x00\x00\x00\x00\x00\x01\x00\x00\x8b\x5f\ +\x00\x00\x02\x84\x00\x00\x00\x00\x00\x01\x00\x00\x4d\x48\ +\x00\x00\x02\xa0\x00\x00\x00\x00\x00\x01\x00\x00\x4e\x6a\ +\x00\x00\x02\xc2\x00\x00\x00\x00\x00\x01\x00\x00\x54\x29\ +\x00\x00\x02\xd8\x00\x00\x00\x00\x00\x01\x00\x00\x59\x4f\ +\x00\x00\x02\xf4\x00\x00\x00\x00\x00\x01\x00\x00\x5e\x63\ +\x00\x00\x03\x0c\x00\x00\x00\x00\x00\x01\x00\x00\x62\xd5\ +\x00\x00\x03\x2a\x00\x00\x00\x00\x00\x01\x00\x00\x69\x3b\ +\x00\x00\x03\x46\x00\x00\x00\x00\x00\x01\x00\x00\x6a\xd1\ +\x00\x00\x03\x62\x00\x00\x00\x00\x00\x01\x00\x00\x6e\xb9\ +\x00\x00\x03\x7c\x00\x00\x00\x00\x00\x01\x00\x00\x77\x1c\ +\x00\x00\x03\x90\x00\x00\x00\x00\x00\x01\x00\x00\x80\x8a\ +\x00\x00\x03\xa8\x00\x00\x00\x00\x00\x01\x00\x00\x83\xae\ +\x00\x00\x03\xc8\x00\x00\x00\x00\x00\x01\x00\x00\x89\xb9\ +\x00\x00\x03\xea\x00\x00\x00\x00\x00\x01\x00\x00\x8d\x29\ " qt_resource_struct_v2 = b"\ -\x00\x00\x00\x00\x00\x02\x00\x00\x00\x25\x00\x00\x00\x01\ +\x00\x00\x00\x00\x00\x02\x00\x00\x00\x26\x00\x00\x00\x01\ \x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\ -\x00\x00\x01\x92\x2f\xfe\x22\x67\ +\x00\x00\x01\x92\x35\xfe\x56\x7b\ \x00\x00\x00\x16\x00\x00\x00\x00\x00\x01\x00\x00\x06\xd5\ -\x00\x00\x01\x92\x2f\xfe\x22\x67\ +\x00\x00\x01\x92\x35\xfe\x56\x7a\ \x00\x00\x00\x34\x00\x00\x00\x00\x00\x01\x00\x00\x08\x4d\ -\x00\x00\x01\x92\x2f\xfe\x22\x63\ +\x00\x00\x01\x92\x35\xfe\x56\x76\ \x00\x00\x00\x4c\x00\x00\x00\x00\x00\x01\x00\x00\x0b\xcd\ -\x00\x00\x01\x92\x2f\xfe\x22\x60\ +\x00\x00\x01\x92\x35\xfe\x56\x73\ \x00\x00\x00\x70\x00\x00\x00\x00\x00\x01\x00\x00\x0d\x32\ -\x00\x00\x01\x92\x2f\xfe\x22\x5f\ +\x00\x00\x01\x92\x35\xfe\x56\x73\ \x00\x00\x00\x88\x00\x00\x00\x00\x00\x01\x00\x00\x14\xe2\ -\x00\x00\x01\x92\x2f\xfe\x22\x5f\ +\x00\x00\x01\x92\x35\xfe\x56\x72\ \x00\x00\x00\xb2\x00\x00\x00\x00\x00\x01\x00\x00\x1c\xa1\ -\x00\x00\x01\x92\x2f\xfe\x22\x62\ +\x00\x00\x01\x92\x35\xfe\x56\x75\ \x00\x00\x00\xc8\x00\x00\x00\x00\x00\x01\x00\x00\x21\x17\ -\x00\x00\x01\x92\x2f\xfe\x22\x62\ +\x00\x00\x01\x92\x35\xfe\x56\x75\ \x00\x00\x00\xe4\x00\x00\x00\x00\x00\x01\x00\x00\x21\xbb\ -\x00\x00\x01\x92\x2f\xfe\x22\x68\ +\x00\x00\x01\x92\x35\xfe\x56\x7b\ \x00\x00\x00\xfe\x00\x00\x00\x00\x00\x01\x00\x00\x24\x93\ -\x00\x00\x01\x92\x2f\xfe\x22\x62\ +\x00\x00\x01\x92\x35\xfe\x56\x75\ \x00\x00\x01\x14\x00\x00\x00\x00\x00\x01\x00\x00\x28\xc5\ -\x00\x00\x01\x92\x2f\xfe\x22\x61\ +\x00\x00\x01\x92\x35\xfe\x56\x74\ \x00\x00\x01\x2a\x00\x00\x00\x00\x00\x01\x00\x00\x2b\x5e\ -\x00\x00\x01\x92\x2f\xfe\x22\x5f\ +\x00\x00\x01\x92\x35\xfe\x56\x72\ \x00\x00\x01\x46\x00\x00\x00\x00\x00\x01\x00\x00\x30\x91\ -\x00\x00\x01\x92\x2f\xfe\x22\x62\ +\x00\x00\x01\x92\x35\xfe\x56\x75\ \x00\x00\x01\x5c\x00\x00\x00\x00\x00\x01\x00\x00\x32\xda\ -\x00\x00\x01\x92\x2f\xfe\x22\x60\ +\x00\x00\x01\x92\x35\xfe\x56\x74\ \x00\x00\x01\x78\x00\x00\x00\x00\x00\x01\x00\x00\x35\xd3\ -\x00\x00\x01\x92\x2f\xfe\x22\x65\ +\x00\x00\x01\x92\x35\xfe\x56\x78\ \x00\x00\x01\x94\x00\x00\x00\x00\x00\x01\x00\x00\x38\x6e\ -\x00\x00\x01\x92\x2f\xfe\x22\x61\ +\x00\x00\x01\x92\x35\xfe\x56\x75\ \x00\x00\x01\xa6\x00\x00\x00\x00\x00\x01\x00\x00\x3c\xc5\ -\x00\x00\x01\x92\x2f\xfe\x22\x65\ +\x00\x00\x01\x92\x35\xfe\x56\x78\ \x00\x00\x01\xc2\x00\x00\x00\x00\x00\x01\x00\x00\x3d\x92\ -\x00\x00\x01\x92\x2f\xfe\x22\x66\ +\x00\x00\x01\x92\x35\xfe\x56\x78\ \x00\x00\x01\xde\x00\x00\x00\x00\x00\x01\x00\x00\x3e\x57\ -\x00\x00\x01\x92\x2f\xfe\x22\x65\ +\x00\x00\x01\x92\x35\xfe\x56\x78\ \x00\x00\x01\xfa\x00\x00\x00\x00\x00\x01\x00\x00\x3f\x24\ -\x00\x00\x01\x92\x2f\xfe\x22\x66\ +\x00\x00\x01\x92\x35\xfe\x56\x78\ \x00\x00\x02\x16\x00\x00\x00\x00\x00\x01\x00\x00\x3f\xf1\ -\x00\x00\x01\x92\x2f\xfe\x22\x61\ +\x00\x00\x01\x92\x35\xfe\x56\x75\ \x00\x00\x02\x34\x00\x00\x00\x00\x00\x01\x00\x00\x42\xd8\ -\x00\x00\x01\x92\x2f\xfe\x22\x63\ +\x00\x00\x01\x92\x35\xfe\x56\x76\ \x00\x00\x02\x50\x00\x00\x00\x00\x00\x01\x00\x00\x49\xd1\ -\x00\x00\x01\x92\x2f\xfe\x22\x64\ +\x00\x00\x01\x92\x35\xfe\x56\x77\ \x00\x00\x02\x66\x00\x00\x00\x00\x00\x01\x00\x00\x4b\x7e\ -\x00\x00\x01\x92\x30\x2c\x43\xd2\ -\x00\x00\x02\x82\x00\x00\x00\x00\x00\x01\x00\x00\x4c\xa0\ -\x00\x00\x01\x92\x2f\xfe\x22\x61\ -\x00\x00\x02\xa4\x00\x00\x00\x00\x00\x01\x00\x00\x52\x5f\ -\x00\x00\x01\x92\x2f\xfe\x22\x66\ -\x00\x00\x02\xba\x00\x00\x00\x00\x00\x01\x00\x00\x57\x85\ -\x00\x00\x01\x92\x2f\xfe\x22\x60\ -\x00\x00\x02\xd6\x00\x00\x00\x00\x00\x01\x00\x00\x5c\x99\ -\x00\x00\x01\x92\x2f\xfe\x22\x5f\ -\x00\x00\x02\xee\x00\x00\x00\x00\x00\x01\x00\x00\x61\x0b\ -\x00\x00\x01\x92\x2f\xfe\x22\x65\ -\x00\x00\x03\x0c\x00\x00\x00\x00\x00\x01\x00\x00\x67\x71\ -\x00\x00\x01\x92\x2f\xfe\x22\x66\ -\x00\x00\x03\x28\x00\x00\x00\x00\x00\x01\x00\x00\x69\x07\ -\x00\x00\x01\x92\x2f\xfe\x22\x63\ -\x00\x00\x03\x44\x00\x00\x00\x00\x00\x01\x00\x00\x6c\xef\ -\x00\x00\x01\x92\x2f\xfe\x22\x68\ -\x00\x00\x03\x5e\x00\x00\x00\x00\x00\x01\x00\x00\x75\x52\ -\x00\x00\x01\x92\x2f\xfe\x22\x68\ -\x00\x00\x03\x72\x00\x00\x00\x00\x00\x01\x00\x00\x7e\xc0\ -\x00\x00\x01\x92\x2f\xfe\x22\x62\ -\x00\x00\x03\x8a\x00\x00\x00\x00\x00\x01\x00\x00\x81\xe4\ -\x00\x00\x01\x92\x2f\xfe\x22\x67\ -\x00\x00\x03\xaa\x00\x00\x00\x00\x00\x01\x00\x00\x87\xef\ -\x00\x00\x01\x92\x2f\xfe\x22\x64\ -\x00\x00\x03\xcc\x00\x00\x00\x00\x00\x01\x00\x00\x8b\x5f\ -\x00\x00\x01\x92\x2f\xfe\x22\x68\ +\x00\x00\x01\x92\x63\xa0\xce\x80\ +\x00\x00\x02\x84\x00\x00\x00\x00\x00\x01\x00\x00\x4d\x48\ +\x00\x00\x01\x92\x35\xfe\x56\x77\ +\x00\x00\x02\xa0\x00\x00\x00\x00\x00\x01\x00\x00\x4e\x6a\ +\x00\x00\x01\x92\x35\xfe\x56\x74\ +\x00\x00\x02\xc2\x00\x00\x00\x00\x00\x01\x00\x00\x54\x29\ +\x00\x00\x01\x92\x35\xfe\x56\x7a\ +\x00\x00\x02\xd8\x00\x00\x00\x00\x00\x01\x00\x00\x59\x4f\ +\x00\x00\x01\x92\x35\xfe\x56\x74\ +\x00\x00\x02\xf4\x00\x00\x00\x00\x00\x01\x00\x00\x5e\x63\ +\x00\x00\x01\x92\x35\xfe\x56\x72\ +\x00\x00\x03\x0c\x00\x00\x00\x00\x00\x01\x00\x00\x62\xd5\ +\x00\x00\x01\x92\x35\xfe\x56\x77\ +\x00\x00\x03\x2a\x00\x00\x00\x00\x00\x01\x00\x00\x69\x3b\ +\x00\x00\x01\x92\x35\xfe\x56\x78\ +\x00\x00\x03\x46\x00\x00\x00\x00\x00\x01\x00\x00\x6a\xd1\ +\x00\x00\x01\x92\x35\xfe\x56\x76\ +\x00\x00\x03\x62\x00\x00\x00\x00\x00\x01\x00\x00\x6e\xb9\ +\x00\x00\x01\x92\x35\xfe\x56\x7b\ +\x00\x00\x03\x7c\x00\x00\x00\x00\x00\x01\x00\x00\x77\x1c\ +\x00\x00\x01\x92\x35\xfe\x56\x7b\ +\x00\x00\x03\x90\x00\x00\x00\x00\x00\x01\x00\x00\x80\x8a\ +\x00\x00\x01\x92\x35\xfe\x56\x76\ +\x00\x00\x03\xa8\x00\x00\x00\x00\x00\x01\x00\x00\x83\xae\ +\x00\x00\x01\x92\x35\xfe\x56\x7a\ +\x00\x00\x03\xc8\x00\x00\x00\x00\x00\x01\x00\x00\x89\xb9\ +\x00\x00\x01\x92\x35\xfe\x56\x77\ +\x00\x00\x03\xea\x00\x00\x00\x00\x00\x01\x00\x00\x8d\x29\ +\x00\x00\x01\x92\x35\xfe\x56\x7c\ " qt_version = [int(v) for v in QtCore.qVersion().split(".")] diff --git a/tdmgr/models/devices.py b/tdmgr/models/devices.py index b19ab8c..fc59c43 100644 --- a/tdmgr/models/devices.py +++ b/tdmgr/models/devices.py @@ -38,7 +38,7 @@ def notify_change(self, d, key): [ key.startswith("POWER"), key.startswith("FriendlyName"), - key in ("RSSI", "LWT", "Color", "HSBColor"), + key in ("RSSI", "LWT", "Color", "HSBColor", "IPAddress", "Gateway", "Ethernet"), key.startswith("Channel"), key.startswith("Dimmer"), key.startswith("ShutterRelay"), @@ -128,9 +128,6 @@ def data(self, idx, role=Qt.DisplayRole): if col_name == "RSSI": return int(d.p.get("RSSI", 0)) - if col_name == "IPAddress": - return d.ip_address - return val if role == DeviceRoles.LWTRole: @@ -160,6 +157,18 @@ def data(self, idx, role=Qt.DisplayRole): if role == DeviceRoles.HardwareRole: return getattr(d.p, "Hardware", "ESP8266") + if role == DeviceRoles.IsEthernetRole: + return ( + d.p.get("IPAddress") == "0.0.0.0" + and d.p.get("Ethernet", {}).get("IPAddress") != "0.0.0.0" + ) + + if role == DeviceRoles.IPAddressRole: + return d.ip_address + + if role == DeviceRoles.GatewayRole: + return d.gateway + if role == Qt.TextAlignmentRole: # Left-aligned columns if col_name in ( diff --git a/tdmgr/models/roles.py b/tdmgr/models/roles.py index 3c0b030..0a42cb2 100644 --- a/tdmgr/models/roles.py +++ b/tdmgr/models/roles.py @@ -13,3 +13,7 @@ class DeviceRoles(int, Enum): ColorRole = auto() ModuleRole = auto() HardwareRole = auto() + + IPAddressRole = auto() + GatewayRole = auto() + IsEthernetRole = auto() diff --git a/tdmgr/tasmota/device.py b/tdmgr/tasmota/device.py index f13cf4b..cd68025 100644 --- a/tdmgr/tasmota/device.py +++ b/tdmgr/tasmota/device.py @@ -365,16 +365,23 @@ def color(self): ) return None - @property - def ip_address(self) -> str: - for ip in [ - self.p.get("IPAddress"), - self.p.get("Ethernet", {}).get("IPAddress"), + def _get_addr_from_wifi_or_ethernet(self, address: str) -> str: + for _address in [ + self.p.get(address), + self.p.get("Ethernet", {}).get(address), ]: - if ip != "0.0.0.0": - return ip + if _address != "0.0.0.0": + return _address return "0.0.0.0" + @property + def ip_address(self) -> str: + return self._get_addr_from_wifi_or_ethernet("IPAddress") + + @property + def gateway(self) -> str: + return self._get_addr_from_wifi_or_ethernet("Gateway") + def setoption(self, o): if 0 <= o < 32: reg = 0 diff --git a/tests/status_parsing/jsonfiles/14.2.0.4/STATUS5.1.json b/tests/status_parsing/jsonfiles/14.2.0.4/STATUS5.1.json index bb765d1..fb30803 100644 --- a/tests/status_parsing/jsonfiles/14.2.0.4/STATUS5.1.json +++ b/tests/status_parsing/jsonfiles/14.2.0.4/STATUS5.1.json @@ -13,7 +13,7 @@ "Mac": "34:98:7A:68:FF:97", "Subnetmask": "255.255.255.0" }, - "Gateway": "192.168.7.1", + "Gateway": "0.0.0.0", "HTTP_API": 1, "Hostname": "tasmota-68FF94-8084", "IP6Global": "", diff --git a/tests/test_device.py b/tests/test_device.py index 9fd7376..d878b3b 100644 --- a/tests/test_device.py +++ b/tests/test_device.py @@ -48,6 +48,22 @@ def test_ip_address(device, version, filename, expected): assert device.ip_address == expected +@pytest.mark.parametrize("version", ("14.2.0.4",)) +@pytest.mark.parametrize( + "filename, expected", + [ + ("STATUS5.json", "192.168.0.99"), + ("STATUS5.1.json", "192.168.7.1"), + ], +) +def test_gateway(device, version, filename, expected): + payload = get_payload(version, filename) + msg = Message("stat/topic/STATUS5", payload, prefix="stat") + device.process_message(msg) + + assert device.gateway == expected + + @pytest.mark.parametrize( "fname, expected", [