def test_one(self): h, m = secs_to_hhmm(0) assert h == 0 assert m == 0
def test_rounding_1(self): h, m = secs_to_hhmm(29) assert h == 0 assert m == 0
def test_rounding_2(self): h, m = secs_to_hhmm(30) assert h == 0 assert m == 1
def test_5(self): h, m = secs_to_hhmm(86400 - 31) assert h == 23 assert m == 59
def test_4(self): h, m = secs_to_hhmm(3600) assert h == 1 assert m == 0
def test_3(self): h, m = secs_to_hhmm(121) assert h == 0 assert m == 2
def test_two(self): h, m = secs_to_hhmm(60) assert h == 0 assert m == 1
def render_page(self, message=None, console=None): logger.info('rendering page') try: tes = list() data = dict() # General System Information m = Model.instance md = m.get_all() d = Data(md) cloud_log_state = md['cloud'] serial = d.get('N/A', 'sys-version', 'serial') tes.append(TE('System', '')) text = nice([('sys', 'System', ''), ('bl', 'Bootloader', ''), ('hw', 'Hardware', '')], md['sys-version'], True) tes.append(TE('Version', text)) dt = d.get('N/A', 'sys-datetime', 'date') tes.append(TE('Date', dt)) ut = d.get('N/A', 'sys-datetime', 'uptime') tes.append(TE('Uptime', ut)) total, free = d.get((0, 0), 'sys-misc', 'mem') tes.append(TE('Memory', f'Total: {total} kB<br>Free: {free} kB')) wear_slc, wear_mlc = d.get((0, 0), 'sys-disc', 'wear') sysroot_info = d.get('N/A', 'sys-disc', 'part_sysroot') data_info = d.get('N/A', 'sys-disc', 'part_data') tes.append( TE( 'Disc', f'eMMC Wear Level: SLC: {wear_slc} %, MLC: {wear_mlc} %<br>' f'Root: {sysroot_info}<br>' f'Data: {data_info}')) a, b, c = d.get((0, 0, 0), 'sys-misc', 'load') tes.append(TE('Load', f'{a}, {b}, {c}')) temp = d.get(0, 'sys-misc', 'temp') tes.append(TE('Temperature', f'{temp:.0f} °C')) v_in = md['sys-misc']['v_in'] v_rtc = md['sys-misc']['v_rtc'] tes.append( TE('Voltages', f'Input: {v_in:.1f} V, RTC: {v_rtc:.2f} V')) # Network Information tes.append(TE('', '')) tes.append(TE('Network', '')) rx, tx = d.get((-1, -1), 'net-wwan0', 'bytes') if rx != -1: rx = int(rx) / 1000000 tx = int(tx) / 1000000 tes.append(TE('wwan0', f'Rx: {rx:.1f} MB<br>Tx: {tx:.1f} MB')) # Modem Information mi = md['modem'] if 'modem-id' in mi: tes.append(TE('', '')) tes.append(TE('Mobile', '')) tes.append(TE('Modem Id', mi['modem-id'])) state = mi['state'] access_tech = mi['access-tech'] tes.append(TE('State', f'{state}, {access_tech}')) if 'location' in mi: loc_info = mi['location'] if loc_info['mcc']: text = nice([('mcc', 'MCC', ''), ('mnc', 'MNC', ''), ('lac', 'LAC', ''), ('cid', 'CID', '')], loc_info) tes.append(TE('Cell', text)) data.update(loc_info) sq = mi['signal-quality'] tes.append(TE('Signal', f'{sq} %')) if access_tech == 'lte': sig = mi['signal-lte'] text = nice([('rsrp', 'RSRP', 'dBm'), ('rsrq', 'RSRQ', 'dB')], sig, True) tes.append(TE('Signal LTE', text)) elif access_tech == 'umts': sig = mi['signal-umts'] text = nice([('rscp', 'RSRP', 'dBm'), ('ecio', 'ECIO', 'dB')], sig, True) tes.append(TE('Signal UMTS', text)) if 'bearer-id' in mi: tes.append(TE('', '')) tes.append(TE('Bearer Id', mi['bearer-id'])) if 'bearer-uptime' in mi: ut = mi['bearer-uptime'] if ut: uth, utm = secs_to_hhmm(ut) tes.append(TE('Uptime', f'{uth}:{utm:02} h')) ip = mi['bearer-ip'] tes.append(TE('IP', ip)) if 'link' in md: if 'delay' in md['link']: delay_in_ms = md['link']['delay'] * 1000.0 tes.append(TE('Ping', f'{delay_in_ms:.0f} ms')) else: tes.append(TE('', '')) tes.append(TE('Modem Id', 'No Modem')) # GNSS if 'gnss-pos' in md: tes.append(TE('', '')) tes.append(TE('GNSS', '')) pos = md['gnss-pos'] tes.append(TE('Fix', pos['fix'])) text = f'Longitude: {pos["lon"]:.9f}, Latitude: {pos["lat"]:.9f}' tes.append(TE('Position', text)) text = nice([('speed', '', 'km/h')], pos) tes.append( TE( 'Speed', f'{pos["speed"]:.0f} m/s, {pos["speed"]*3.60:.0f} km/h' )) self.render('main.html', title=f'{serial}', table=tes, data=data, message=message, console=console, version=version, cloud_log=cloud_log_state) except KeyError as e: logger.warning(f'lookup error {e}') self.render('main.html', title='NG800/VCU Pro', message=f'Data lookup error: {e} not found', table=None, data=None, console=None, version='n/a', cloud_log=False)