66from pathlib import Path
77from textwrap import wrap
88from types import ModuleType
9- from typing import Any
9+ from typing import TYPE_CHECKING , Any
1010
1111from prettytable import PrettyTable
1212
13+ if TYPE_CHECKING :
14+ from sunsynk .sensors import Sensor
15+ from sunsynk .sunsynk import Sunsynk
16+
1317
1418def import_module (mod_name : str , folder : str | Path | None = None ) -> ModuleType :
1519 """import_module."""
@@ -57,15 +61,9 @@ def pretty_table[T](
5761 if calculated_cols :
5862 for colidx , func in calculated_cols .items ():
5963 row [int (colidx )] = func (row_any )
60-
61- if wrap_length == 0 or not any (len (v ) > wrap_length for v in row ):
62- table .add_row (row )
63- continue
64-
65- row_wrap = [wrap (v , wrap_length ) for v in row ]
66- while any (row_wrap ):
67- table .add_row ([r [0 ] if r else "" for r in row_wrap ])
68- row_wrap = [r [1 :] for r in row_wrap ]
64+ if wrap_length > 0 :
65+ row = ["\n " .join (wrap (v , wrap_length )) for v in row ]
66+ table .add_row (row )
6967
7068 return table
7169
@@ -77,3 +75,19 @@ def table_data[T](
7775 if headers is None :
7876 headers = list ({k for v in data for k in v .keys ()})
7977 return headers , [[v .get (k ) for k in headers ] for v in data ]
78+
79+
80+ def pretty_table_sensors (
81+ sensors : list ["Sensor" ], inv : "Sunsynk" , add_info : dict [str , str ]
82+ ) -> PrettyTable :
83+ """Generate a pretty table for the given sensors."""
84+ data : list [list [str ]] = []
85+ for sen in sorted (sensors , key = lambda s : s .address ):
86+ row = [sen .id , sen .source , f"{ inv .state [sen ]} { sen .unit } " ]
87+ if sen .id == "serial" :
88+ row [2 ] = f"****{ row [2 ][- 4 :]} "
89+ if addi := add_info .get (sen .id ):
90+ row [2 ] += f"{ addi } "
91+ data .append (row )
92+
93+ return pretty_table (["Sensor" , "Source" , "Value" ], data , wrap_length = 0 )
0 commit comments